December 03, 2020, 08:27:32 PM

Author Topic: [bmx] Concave/convex polygon collisions and other useful functions. by Oddball [ 1+ years ago ]  (Read 385 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Concave/convex polygon collisions and other useful functions.
Author : Oddball
Posted : 1+ years ago

Description : Polygon collision functions.

TFormPolyToTFormPoly()
Checks for collisions between two transformed polygons.

PolyToTFormPoly()
Checks for collisions between a standard polygon and a transformed polygon.

PolyToPoly()
Checks for collision between two standard polygon arrays.

CircleToTFormPoly()
Checks for collision between a circle and a transformed polygon.

CircleToPoly()
Checks for collision between a circle and a standard polygon array.

LineToTFormPoly()
Checks for collision between a line and a transformed polygon.

LineToPoly()
Checks for collision between a line and a standard polygon array.

PointInTFormPoly()
Checks if the given point is in a transformed polygon.

PointInPoly()
Checks if the given point is in a standard polygon array.

TFormPoly()
Returns a transformed polygon from a standard polygon array.

TFormGlobalToLocal()
Transforms a point from global/screen coordinates too local/polygon/image coordinates.

TFormLocalToGlobal()
Transforms a point from local/polygon/image coordinates to global/screen coordinates.

LinesCross()
Checks if two lines intersect. Adapted from code by Fredborg.

LineToCircle()
Checks for collision between a line and a circle. Adapted from code by TomToad.

<a href="codearcse275.html?code=1664" target="_blank">DrawPoly()[/url]
An improved DrawPoly command. For more info see <a href="codearcse275.html?code=1664" target="_blank">here[/url].


Code :
Code: BlitzMax
  1. 'Code by Dave 'Oddball' Williamson
  2. Strict
  3.  
  4. Function TFormPolyToTFormPoly( p1_xy:Float[], p1_x:Float=0, p1_y:Float=0,..
  5.                                                 p1_rot:Float=0, p1_scale_x:Float=1, p1_scale_y:Float=1,..
  6.                                                 p1_handle_x:Float=0, p1_handle_y:Float=0,..
  7.                                                 p1_origin_x:Float=0, p1_origin_y:Float=0,..
  8.                                                 p2_xy:Float[], p2_x:Float=0, p2_y:Float=0,..
  9.                                                 p2_rot:Float=0, p2_scale_x:Float=1, p2_scale_y:Float=1,..
  10.                                                 p2_handle_x:Float=0, p2_handle_y:Float=0,..
  11.                                                 p2_origin_x:Float=0, p2_origin_y:Float=0)
  12.        
  13.         If p1_xy.length<6 Or (p1_xy.length&1) Return False
  14.         If p2_xy.length<6 Or (p2_xy.length&1) Return False
  15.        
  16.         Local tform1_xy:Float[]=TFormPoly(p1_xy,p1_x,p1_y,p1_rot,p1_scale_x,p1_scale_y,..
  17.                                                 p1_handle_x,p1_handle_y,p1_origin_x,p1_origin_y)
  18.        
  19.         Local tform2_xy:Float[]=TFormPoly(p2_xy,p2_x,p2_y,p2_rot,p2_scale_x,p2_scale_y,..
  20.                                                 p2_handle_x,p2_handle_y,p2_origin_x,p2_origin_y)
  21.        
  22.         If PolyToPoly(tform1_xy,tform2_xy)
  23.                 Return True
  24.         Else
  25.                 Return False
  26.         EndIf
  27.        
  28. End Function
  29.  
  30. Function PolyToTFormPoly( p1_xy:Float[], p2_xy:Float[],..
  31.                                                 p2_x:Float=0, p2_y:Float=0, rot:Float=0,..
  32.                                                 scale_x:Float=1, scale_y:Float=1,..
  33.                                                 handle_x:Float=0, handle_y:Float=0,..
  34.                                                 origin_x:Float=0, origin_y:Float=0 )
  35.        
  36.         If p1_xy.length<6 Or (p1_xy.length&1) Return False
  37.         If p2_xy.length<6 Or (p2_xy.length&1) Return False
  38.        
  39.         Local tform_xy:Float[]=TFormPoly(p2_xy,p2_x,p2_y,rot,scale_x,scale_y,..
  40.                                                 handle_x,handle_y,origin_x,origin_y)
  41.        
  42.         If PolyToPoly(p1_xy,tform_xy)
  43.                 Return True
  44.         Else
  45.                 Return False
  46.         EndIf
  47.        
  48. End Function
  49.  
  50. Function PolyToPoly( p1_xy:Float[], p2_xy:Float[] )
  51.        
  52.         If p1_xy.length<6 Or (p1_xy.length&1) Return False
  53.         If p2_xy.length<6 Or (p2_xy.length&1) Return False
  54.        
  55.         For Local i:Int=0 Until p1_xy.Length Step 2
  56.                 If PointInPoly(p1_xy[i],p1_xy[i+1],p2_xy) Then Return True
  57.         Next
  58.         For Local i:Int=0 Until p2_xy.Length Step 2
  59.                 If PointInPoly(p2_xy[i],p2_xy[i+1],p1_xy) Then Return True
  60.         Next
  61.        
  62.         Local l1_x1:Float=p1_xy[p1_xy.Length-2]
  63.         Local l1_y1:Float=p1_xy[p1_xy.Length-1]
  64.         For Local i1:Int=0 Until p1_xy.Length Step 2
  65.                 Local l1_x2=p1_xy[i1]
  66.                 Local l1_y2=p1_xy[i1+1]
  67.                
  68.                 Local l2_x1:Float=p2_xy[p2_xy.Length-2]
  69.                 Local l2_y1:Float=p2_xy[p2_xy.Length-1]
  70.                 For Local i2:Int=0 Until p2_xy.Length Step 2
  71.                         Local l2_x2=p2_xy[i2]
  72.                         Local l2_y2=p2_xy[i2+1]
  73.                        
  74.                         If LinesCross(l1_x1,l1_y1,l1_x2,l1_y2,l2_x1,l2_y1,l2_x2,l2_y2)
  75.                                 Return True
  76.                         EndIf
  77.                        
  78.                         l2_x1=l2_x2
  79.                         l2_y1=l2_y2
  80.                 Next
  81.                 l1_x1=l1_x2
  82.                 l1_y1=l1_y2
  83.         Next
  84.         Return False
  85. End Function
  86.  
  87. Function CircleToTFormPoly( circle_x:Float, circle_y:Float, radius:Float,..
  88.                                                 xy:Float[], poly_x:Float=0, poly_y:Float=0, rot:Float=0,..
  89.                                                 scale_x:Float=1, scale_y:Float=1,..
  90.                                                 handle_x:Float=0, handle_y:Float=0,..
  91.                                                 origin_x:Float=0, origin_y:Float=0 )
  92.        
  93.         If xy.length<6 Or (xy.length&1) Return False
  94.        
  95.         Local tform_xy:Float[]=TFormPoly(xy,poly_x,poly_y,rot,scale_x,scale_y,..
  96.                                                 handle_x,handle_y,origin_x,origin_y)
  97.        
  98.         Return CircleToPoly(circle_x,circle_y,radius,tform_xy)
  99. End Function
  100.  
  101. Function CircleToPoly( circle_x:Float, circle_y:Float, radius:Float, xy:Float[] )
  102.        
  103.         If xy.length<6 Or (xy.length&1) Return False
  104.        
  105.         If PointInPoly(circle_x,circle_y,xy) Then Return True
  106.        
  107.         Local x1:Float=xy[xy.Length-2]
  108.         Local y1:Float=xy[xy.Length-1]
  109.        
  110.         For Local i:Int=0 Until Len xy Step 2
  111.                 Local x2:Float=xy[i]
  112.                 Local y2:Float=xy[i+1]
  113.                
  114.                 If LineToCircle(x1,y1,x2,y2,circle_x,circle_y,radius) Then Return True
  115.                 x1=x2
  116.                 y1=y2
  117.         Next
  118.        
  119.         Return False
  120. End Function
  121.  
  122. Function LineToTFormPoly( line_x1:Float, line_y1:Float, line_x2:Float, line_y2:Float,..
  123.                                                 xy:Float[], poly_x:Float=0, poly_y:Float=0,..
  124.                                                 rot:Float=0, scale_x:Float=1, scale_y:Float=1,..
  125.                                                 handle_x:Float=0, handle_y:Float=0,..
  126.                                                 origin_x:Float=0, origin_y:Float=0 )
  127.        
  128.         If xy.length<6 Or (xy.length&1) Return False
  129.        
  130.         TFormGlobalToLocal(line_x1,line_y1,poly_x,poly_y,rot,scale_x,..
  131.                                                 scale_y,handle_x,handle_y,origin_x,origin_y)
  132.        
  133.         TFormGlobalToLocal(line_x2,line_y2,poly_x,poly_y,rot,scale_x,..
  134.                                                 scale_y,handle_x,handle_y,origin_x,origin_y)
  135.        
  136.         Return LineToPoly(line_x1,line_y1,line_x2,line_y2,xy)
  137. End Function
  138.  
  139. Function LineToPoly( line_x1:Float, line_y1:Float, line_x2:Float, line_y2:Float, xy:Float[] )
  140.        
  141.         If xy.length<6 Or (xy.length&1) Return False
  142.        
  143.         If PointInPoly(line_x1,line_y1,xy) Then Return True
  144.        
  145.         Local poly_x1:Float=xy[xy.Length-2]
  146.         Local poly_y1:Float=xy[xy.Length-1]
  147.        
  148.         For Local i:Int=0 Until Len xy Step 2
  149.                 Local poly_x2:Float=xy[i]
  150.                 Local poly_y2:Float=xy[i+1]
  151.                
  152.                 If LinesCross(line_x1,line_y1,line_x2,line_y2,..
  153.                                                 poly_x1,poly_y1,poly_x2,poly_y2) Then Return True
  154.                 poly_x1=poly_x2
  155.                 poly_y1=poly_y2
  156.         Next
  157.        
  158.         Return False
  159.        
  160. End Function
  161.  
  162. Function PointInTFormPoly( point_x:Float, point_y:Float, xy:Float[],..
  163.                                                 poly_x:Float=0, poly_y:Float=0, rot:Float=0,..
  164.                                                 scale_x:Float=1, scale_y:Float=1,..
  165.                                                 handle_x:Float=0, handle_y:Float=0,..
  166.                                                 origin_x:Float=0, origin_y:Float=0 )
  167.        
  168.         If xy.length<6 Or (xy.length&1) Return False
  169.        
  170.         TFormGlobalToLocal(point_x,point_y,poly_x,poly_y,rot,scale_x,..
  171.                                                 scale_y,handle_x,handle_y,origin_x,origin_y)
  172.        
  173.         Return PointInPoly(point_x,point_y,xy)
  174. End Function
  175.  
  176. Function PointInPoly( point_x:Float, point_y:Float, xy:Float[] )
  177.        
  178.         If xy.length<6 Or (xy.length&1) Return False
  179.        
  180.         Local x1:Float=xy[xy.Length-2]
  181.         Local y1:Float=xy[xy.Length-1]
  182.         Local cur_quad:Int=GetQuad(point_x,point_y,x1,y1)
  183.         Local next_quad:Int
  184.         Local total:Int
  185.        
  186.         For Local i=0 Until Len xy Step 2
  187.                 Local x2:Float=xy[i]
  188.                 Local y2:Float=xy[i+1]
  189.                 next_quad=GetQuad(point_x,point_y,x2,y2)
  190.                 Local diff:Int=next_quad-cur_quad
  191.                
  192.                 Select diff
  193.                 Case 2,-2
  194.                         If ( x2 - ( ((y2 - point_y) * (x1 - x2)) / (y1 - y2) ) )<point_x
  195.                                 diff=-diff
  196.                         EndIf
  197.                 Case 3
  198.                         diff=-1
  199.                 Case -3
  200.                         diff=1
  201.                 End Select
  202.                
  203.                 total:+diff
  204.                 cur_quad=next_quad
  205.                 x1=x2
  206.                 y1=y2
  207.         Next
  208.        
  209.         If Abs(total)=4 Then Return True Else Return False
  210. End Function
  211.  
  212. Function TFormPoly:Float[]( xy:Float[], tform_x:Float=0, tform_y:Float=0, rot:Float=0,..
  213.                                                 scale_x:Float=1, scale_y:Float=1,..
  214.                                                 handle_x:Float=0, handle_y:Float=0,..
  215.                                                 origin_x:Float=0, origin_y:Float=0 )
  216.        
  217.         If xy.length<6 Or (xy.length&1) Return Null
  218.        
  219.         Local tform_xy:Float[]=xy[..]
  220.        
  221.         For Local i=0 Until tform_xy.Length Step 2
  222.                 TFormLocalToGlobal(tform_xy[i],tform_xy[i+1],tform_x,tform_y,rot,..
  223.                                                 scale_x,scale_y,handle_x,handle_y,origin_x,origin_y)
  224.         Next
  225.        
  226.         Return tform_xy
  227. End Function
  228.  
  229. Function TFormGlobalToLocal( point_x:Float Var, point_y:Float Var,..
  230.                                                 tform_x:Float=0, tform_y:Float=0, rot:Float=0,..
  231.                                                 scale_x:Float=1, scale_y:Float=1,..
  232.                                                 handle_x:Float=0, handle_y:Float=0,..
  233.                                                 origin_x:Float=0, origin_y:Float=0 )
  234.        
  235.         point_x:-origin_x
  236.         point_y:-origin_y
  237.        
  238.         point_x:-tform_x
  239.         point_y:-tform_y
  240.        
  241.         Local mag:Float=Sqr(point_x*point_x+point_y*point_y)
  242.         Local ang:Float=ATan2(point_y,point_x)
  243.         point_x=Cos(ang-rot)*mag
  244.         point_y=Sin(ang-rot)*mag
  245.        
  246.         point_x:/scale_x
  247.         point_y:/scale_y
  248.        
  249.         point_x:+handle_x
  250.         point_y:+handle_y
  251. End Function
  252.  
  253. Function TFormLocalToGlobal( point_x:Float Var, point_y:Float Var,..
  254.                                                 tform_x:Float=0, tform_y:Float=0, rot:Float=0,..
  255.                                                 scale_x:Float=1, scale_y:Float=1,..
  256.                                                 handle_x:Float=0, handle_y:Float=0,..
  257.                                                 origin_x:Float=0, origin_y:Float=0 )
  258.        
  259.         point_x:-handle_x
  260.         point_y:-handle_y
  261.        
  262.         point_x:*scale_x
  263.         point_y:*scale_y
  264.        
  265.         Local mag:Float=Sqr(point_x*point_x+point_y*point_y)
  266.         Local ang:Float=ATan2(point_y,point_x)
  267.         point_x=Cos(ang+rot)*mag
  268.         point_y=Sin(ang+rot)*mag
  269.        
  270.         point_x:+tform_x
  271.         point_y:+tform_y
  272.        
  273.         point_x:+origin_x
  274.         point_y:+origin_y
  275. End Function
  276.  
  277. 'Adapted from Fredborg's code
  278. Function LinesCross( x0:Float, y0:Float , x1:Float, y1:Float,..
  279.                                                 x2:Float ,y2:Float, x3:Float, y3:Float )
  280.          
  281.         Local n:Float=(y0-y2)*(x3-x2)-(x0-x2)*(y3-y2)
  282.         Local d:Float=(x1-x0)*(y3-y2)-(y1-y0)*(x3-x2)
  283.        
  284.         If Abs(d) < 0.0001
  285.                 ' Lines are parallel!
  286.                 Return False
  287.         Else
  288.                 ' Lines might cross!
  289.                 Local Sn:Float=(y0-y2)*(x1-x0)-(x0-x2)*(y1-y0)
  290.  
  291.                 Local AB:Float=n/d
  292.                 If AB>0.0 And AB<1.0
  293.                         Local CD:Float=Sn/d
  294.                         If CD>0.0 And CD<1.0
  295.                                 ' Intersection Point
  296.                                 Local X=x0+AB*(x1-x0)
  297.                         Local Y=y0+AB*(y1-y0)
  298.                                 Return True
  299.                         End If
  300.                 End If
  301.        
  302.                 ' Lines didn't cross, because the intersection was beyond the end points of the lines
  303.         EndIf
  304.  
  305.         ' Lines do Not cross!
  306.         Return False
  307.  
  308. End Function
  309.  
  310. 'Adapted from TomToad's code
  311. Function LineToCircle( x1:Float, y1:Float, x2:Float, y2:Float, px:Float, py:Float, r:Float )
  312.        
  313.         Local sx:Float = x2-x1
  314.         Local sy:Float = y2-y1
  315.        
  316.         Local q:Float = ((px-x1) * (x2-x1) + (py - y1) * (y2-y1)) / (sx*sx + sy*sy)
  317.        
  318.         If q < 0.0 Then q = 0.0
  319.         If q > 1.0 Then q = 1.0
  320.        
  321.         Local cx:Float=(1-q)*x1+q*x2
  322.         Local cy:Float=(1-q)*y1 + q*y2
  323.        
  324.        
  325.         If PointToPointDist(px,py,cx,cy) < r
  326.                
  327.                 Return True
  328.                
  329.         Else
  330.                
  331.                 Return False
  332.                
  333.         EndIf
  334.  
  335.        
  336. End Function
  337.  
  338. Function PointToPointDist:Float( x1:Float, y1:Float, x2:Float, y2:Float )
  339.  
  340.         Local dx:Float = x1-x2
  341.         Local dy:Float = y1-y2
  342.        
  343.         Return Sqr(dx*dx + dy*dy)
  344. End Function
  345.  
  346.  
  347. Function GetQuad(axis_x:Float,axis_y:Float,vert_x:Float,vert_y:Float)
  348.         If vert_x<axis_x
  349.                 If vert_y<axis_y
  350.                         Return 1
  351.                 Else
  352.                         Return 4
  353.                 EndIf
  354.         Else
  355.                 If vert_y<axis_y
  356.                         Return 2
  357.                 Else
  358.                         Return 3
  359.                 EndIf  
  360.         EndIf
  361.  
  362. End Function
  363.  
  364. ?win
  365. SetGraphicsDriver GLMax2DDriver()
  366. ?
  367. Graphics 800,600,32,60
  368. HideMouse
  369.  
  370. Local verts:Float[]=[-25.0,0.0,-75.0,75.0,0.0,50.0,100.0,100.0,..
  371. 50.0,25.0,100.0,0.0,50.0,-25.0,100.0,-100.0,0.0,-50.0,-75.0,-75.0]
  372. Local cursor:Float[]=[0.0,-50.0,100.0,-100.0,50.0,0.0,100.0,100.0,..
  373. 0.0,50.0,-100.0,100.0,-50.0,0.0,-100.0,-100.0]
  374.  
  375. Local ang:Float=0
  376.  
  377. Local coltype:Int=0
  378.  
  379. Local rad:Float=20
  380.  
  381. Repeat
  382.        
  383.         If KeyHit(KEY_1) Then coltype=0
  384.         If KeyHit(KEY_2) Then coltype=1
  385.         If KeyHit(KEY_3) Then coltype=3
  386.         If KeyHit(KEY_4) Then coltype=2
  387.        
  388.         Local x:Float=400
  389.         Local y:Float=300
  390.         Local rot:Float=ang/2
  391.         Local sx:Float=Cos(ang)/2+1.5
  392.         Local sy:Float=Sin(ang)/2+1.5
  393.         Local hx:Float=Cos(ang)*50
  394.         Local hy:Float=Sin(ang)*50
  395.         Local ox:Float=Cos(ang/2)*50
  396.         Local oy:Float=Sin(ang/2)*50
  397.         Local lx:Float=400+Cos(-ang)*300
  398.         Local ly:Float=300+Sin(-ang)*300
  399.        
  400.         SetRotation rot
  401.         SetScale sx,sy
  402.         SetHandle hx,hy
  403.         SetOrigin ox,oy
  404.        
  405.         Local mx:Int=MouseX()
  406.         Local my:Int=MouseY()
  407.        
  408.         Cls
  409.        
  410.         Select coltype
  411.         Case 0
  412.                 If PointInTFormPoly(mx,my,verts,x,y,rot,sx,sy,hx,hy,ox,oy)
  413.                         SetColor 0,255,255
  414.                 Else
  415.                         SetColor 0,128,128
  416.                 EndIf
  417.         Case 1
  418.                 If CircleToTFormPoly(mx,my,rad,verts,x,y,rot,sx,sy,hx,hy,ox,oy)
  419.                         SetColor 0,255,255
  420.                 Else
  421.                         SetColor 0,128,128
  422.                 EndIf
  423.         Case 2
  424.                 If TFormPolyToTFormPoly(verts,x,y,rot,sx,sy,hx,hy,ox,oy,cursor,mx,my,-rot,0.5,0.5)
  425.                         SetColor 0,255,255
  426.                 Else
  427.                         SetColor 0,128,128
  428.                 EndIf
  429.         Case 3
  430.                 If LineToTFormPoly(mx,my,lx,ly,verts,x,y,rot,sx,sy,hx,hy,ox,oy)
  431.                         SetColor 0,255,255
  432.                 Else
  433.                         SetColor 0,128,128
  434.                 EndIf
  435.         End Select
  436.        
  437.         DrawPoly verts,True,x,y
  438.        
  439.         SetRotation 0
  440.         SetScale 1,1
  441.         SetHandle 0,0
  442.         SetOrigin 0,0
  443.         SetColor 255,255,255
  444.         DrawText "Select 1, 2, 3 or 4",5,0
  445.         DrawText "1: PointToTFormPoly",5,20
  446.         DrawText "2: CircleToTFormPoly",5,35
  447.         DrawText "3: LineToTFormPoly",5,50
  448.         DrawText "4: TFormPolyToTFormPoly",5,65
  449.         SetColor 255,0,0
  450.        
  451.         Select coltype
  452.         Case 0
  453.                 DrawLine mx,my-10,mx,my+10,True
  454.                 DrawLine mx-10,my,mx+10,my,True
  455.         Case 1
  456.                 DrawOval mx-rad,my-rad,rad*2,rad*2
  457.         Case 2
  458.                 SetRotation -rot
  459.                 SetScale 0.5,0.5
  460.                 DrawPoly cursor,True,mx,my
  461.         Case 3
  462.                 DrawLine mx,my,lx,ly,True
  463.         End Select
  464.         Flip
  465.        
  466.         ang:+1
  467.        
  468. Until KeyHit(KEY_ESCAPE)
  469.  
  470. Function DrawPoly( xy:Float[], fill:Int=True, x:Float=0, y:Float=0 )
  471.         Local origin_x:Float
  472.         Local origin_y:Float
  473.         GetOrigin origin_x,origin_y
  474.         Local handle_x:Float
  475.         Local handle_y:Float
  476.         GetHandle handle_x,handle_y
  477.        
  478.         If fill
  479.                 _max2dDriver.DrawPoly xy,..
  480.                 -handle_x,-handle_y,..
  481.                 x+origin_x,y+origin_y
  482.         Else
  483.                 Local x1:Float=xy[xy.Length-2]
  484.                 Local y1:Float=xy[xy.Length-1]
  485.                 For Local i:Int=0 Until Len xy Step 2
  486.                         Local x2:Float=xy[i]
  487.                         Local y2:Float=xy[i+1]
  488.                         _max2dDriver.DrawLine..
  489.                         -handle_x+x1,-handle_y+y1,..
  490.                         -handle_x+x2,-handle_y+y2,..
  491.                         x+origin_x-0.5,y+origin_y-0.5
  492.                         x1=x2
  493.                         y1=y2
  494.                 Next
  495.         EndIf
  496. End Function


Comments :


Oddball(Posted 1+ years ago)

 Updated to include LineToPoly collisions.


Oddball(Posted 1+ years ago)

 Fixed rounding bug in LineToCircle.


puki(Posted 1+ years ago)

 This looks most interesting - never knew it was here - I didn't spot the post 4 months ago.


SillyPutty(Posted 1+ years ago)

 This is very cool - thanks!


Ryan Burnside(Posted 1+ years ago)

 Great Work! You'll be properly credited when I use it.


Oddball(Posted 1+ years ago)

 Thanks for the comments guys.


burpy(Posted 1+ years ago)

 sorry wrong post


Oddball(Posted 1+ years ago)

 Corrected an error in DrawPoly function. Doesn't effect any of the other functions, but the example code should work correctly now.


MGE(Posted 1+ years ago)

 Thanks for making this available. Is there any chance of a basic example using these functions? Would love to see it in action. (Prolly too much to ask?) ;)


klepto2(Posted 1+ years ago)

 Check the source, there is already a sample included.


Grey Alien(Posted 1+ years ago)

 This is radical, thanks!


big10p(Posted 1+ years ago)

 Some nice looking stuff here I may be able to make good use of, thanks.One thing I noticed in the LineToCircle function - you can replace this line:
Code: [Select]
If PointToPointDist(px,py,cx,cy) < r
with this:
Code: [Select]
dx:Float = px - cx
dy:Float = py - cy

If (dx * dx + dy * dy) < (r * r)
to elimante the call to PointToPointDist and thus also elimate the use of Sqr.


Raz(Posted 1+ years ago)

 I know this is old, but just wanted to say thanks, this is going to save me a tonne of work!


Hardcoal(Posted 1+ years ago)

 Great work!Im just realizing the importance of this section in the forum [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal