.البته ابتدا باید چک شود که بردار جهت و ضلع ما موازی نباشند.(n X (a-b)!=0) . همانطور که میدانیم اضلاع AABB دارای 4 ضلع است که برای هر ضلع یک ضلع موازی دیگر وجود دارد، که همچنین برای این اضلاع یک بردار عمود وجود دارد، بردار یکه این بردار عمود همان بردار جهت slab ما می باشد، بنابر این طبق این تعاریف هر AABB از دو slab تشکیل شده است، چون در AABB ها چرخش وجود ندارد، جهات slab ما در واقع دو محور دستگاه مختصات هستند، یعنی (1,0)Y= , (0,1)X= ، بنابراین می توانیم در ضرب بردار ها با این دو جهت مستقیم پارامتر های بردار را جایگذین کنیم، برای مثال a.x*1+a.y*0 =a.x = a.dot(1,0)
در ساختمان داده AABB دو بردار min و max تعریف شده است، مولفه های این دو بردار در واقع همان فواصل ما در تعریف slab هستند، برای مثال در slab که جهت آن محور X می باشد فواصل برابر مولفه های x aabb ما هستند. اگر بخواهیم این دو فاصله را با d1 وd2 نشان دهیم خواهیم داشت d1=min.x و d2=max.x ، و همین قضیه برای محور Y ها صادق هست.
برای هر slab و ray دو برخورد وجود خواهد داشت، که این دو برخورد یک فاصله interval)) را تشکیل می دهند. برای تشخیص برخورد باید چک کنیم که این فواصل با هم همپوشانی دارند یا نه.
برای هر فاصله یا به عنوان دیگر slab مقادیر min و max داشته باشیم، اگر ماکس min ها و مین max ها را مقایسه کنیم و مین ما از مکس ما کمتر باشد نتیجه میگیریم برخورد رخ داده است:
//for direction (1,0)
var d:Number=aabb.min.x;
var denom:Number=dir.x
var t1x:Number=(d-o.x)/denom
d=aabb.max.x
var t2x:Number=(d-o.x)/denom
if(t1x>t2x){
var tmp:Number=t2x
t2x=t1x
t1x=tmp;
}
//for direction (0,1)
d=aabb.min.y
denom=dir.y
var t1y:Number=(d-o.y)/denom
d=aabb.max.y
var t2y:Number=(d-o.y)/denom
if(t1y>t2y){
tmp=t2y
t2y=t1y
t1y=tmp;
}
var minMax:Number=Math.min(t2x,t2y)
//set negative multiplier to ZERO
minMax=minMax<0?0:minMax
var maxMin:Number=Math.max(t1x,t1y)
maxMin=maxMin<0?0:maxMin
if(minMax>maxMin) {
var s:Vec2D=dir.scaledBy(maxMin)
s.add(o)
p.setVec2D(s)
return true;
}