Const MAXdistance = 9999999
;_____________________________________________________
Function DistancePointToPoint#(ax#, ay#, bx0#, by0# )
Return (( (ax - bx0) * (ax - bx0) + (ay - by0) * (ay - by0) )^0.5)
End Function
;_____________________________________________________
Function DistancePointToLine#(ax#, ay#, bx0#, by0#, bx1#, by1#)
If bx0 = bx1 And by0 = by1 Then Return DistancePointToPoint#(ax#, ay#, bx0#, by0# )
Local localVx# = bx1 - bx0
Local localVy# = by1 - by0
Local tenzor# = ((ax - bx0) * (bx1 - bx0) + (ay - by0) * (by1 - by0)) / (localVx * localVx + localVy * localVy)
If tenzor < 0.0 Then tenzor = 0.0
If tenzor > 1.0 Then tenzor = 1.0
Return DistancePointToPoint#(ax#, ay#, (1 - tenzor) * bx0 + tenzor * bx1, (1 - tenzor) * by0 + tenzor * by1)
End Function
;_____________________________________________________
Function DistancePointToCircle#(ax#, ay#, bx0#, by0#, radius#)
Local LocalDistance# = DistancePointToPoint(ax#, ay#, bx0#, by0# ) - radius
If LocalDistance < radius
Return 0
Else
Return DistancePointToPoint(ax#, ay#, bx0#, by0# ) - radius
EndIf
End Function
;_____________________________________________________
Function DistancePointToRect#(ax#,ay#, ox#, oy#, width#, height#)
Local Localdist#[3], ox2# = ox + width, oy2# = oy + height, distminimum# = MAXdistance
If mx < ox2 And mx > ox And my < oy2 And my > oy Return 0
Localdist[0] = DistancePointToLine#(ax#, ay#, ox, oy, ox2, oy)
If Localdist[0] <=0 Return 0
Localdist[1] = DistancePointToLine#(ax#, ay#, ox2, oy, ox2, oy2)
If Localdist[1] <=0 Return 0
Localdist[2] = DistancePointToLine#(ax#, ay#, ox2, oy2, ox, oy2)
If Localdist[2] <=0 Return 0
Localdist[3] = DistancePointToLine#(ax#, ay#, ox, oy2, ox, oy)
If Localdist[3] <=0 Return 0
For k = 0 To 3
If Localdist[k] < distminimum Then distminimum = Localdist[k]
Next
Return distminimum
End Function
;_____________________________________________________
Function DistancePointToPoly#(ax#,ay#, ox#, oy#,bx#, by#, cx#, cy#, dx#, dy#)
Local Localdist#[3], distminimum# = MAXdistance
Localdist[0] = DistancePointToLine#(ax#, ay#, ox, oy, bx, by)
If Localdist[0] <=0 Return 0
Localdist[1] = DistancePointToLine#(ax#, ay#, bx, by, cx, cy)
If Localdist[1] <=0 Return 0
Localdist[2] = DistancePointToLine#(ax#, ay#, cx, cy, dx, dy)
If Localdist[2] <=0 Return 0
Localdist[3] = DistancePointToLine#(ax#, ay#, dx, dy, ox, oy)
If Localdist[3] <=0 Return 0
For k = 0 To 3
If Localdist[k] < distminimum Then distminimum = Localdist[k]
Next
If distminimum > 0
Local Localb0# = ((ay - oy) * (bx - ox)) - ((ax - ox) * (by - oy))
Local Localb1# = ((ay - by) * (cx - bx)) - ((ax - bx) * (cy - by))
Local Localb2# = ((ay - cy) * (dx - cx)) - ((ax - cx) * (dy - cy))
Local Localb3# = ((ay - dy) * (ox - dx)) - ((ax - dx) * (oy - dy))
EndIf
If (Localb0 > 0 And Localb1 > 0 And Localb2 > 0 And Localb3 > 0) Return 0 Else Return distminimum
End Function
;_____________________________________________________
Function DistanceCircleToLine#( ax#, ay#, radius#, bx0#, by0#, bx1#, by1#)
Local result# = DistancePointToLine#(ax#, ay#, bx0#, by0#, bx1#, by1#) - radius
If result <= 0 Return 0 Else Return result
End Function
;_____________________________________________________
Function DistanceCircleToCircle#(ax#, ay#, radius#, ax1#, ay1#, radius1# )
Local result# = DistancePointToPoint#(ax#, ay#, ax1#, ay1# ) - (radius + radius1)
If result <= 0 Return 0 Else Return result
End Function
;_____________________________________________________
Function DistanceCircleToRect#(ax#, ay#, radius#, bx#, by#, width#, height# )
Local result# = DistancePointToRect#(ax#,ay#, bx#, by#, width#, height#) - radius
If result <= 0 Return 0 Else Return result
End Function
;_____________________________________________________
Function DistanceCircleToPoly#(ax#, ay#, radius#, ox#, oy#,bx#, by#, cx#, cy#, dx#, dy#)
Local result# = DistancePointToPoly#(ax#,ay#, ox#, oy#,bx#, by#, cx#, cy#, dx#, dy#) - radius
If result <= 0 Return 0 Else Return result
End Function
;_____________________________________________________
Function DistanceLineToLine#(ax#, ay#, ax1#, ay1#, bx#, by#, bx1#, by1#)
Local ua_t#, ub_t#, u_b#, ua#, ub#, result = 0
ua_t = (bx1 - bx) * (ay - by) - (by1 - by) * (ax - bx);
ub_t = (ax1 - ax) * (ay - by) - (ay1 - ay) * (ax - bx);
u_b = (by1 - by) * (ax1 - ax) - (bx1 - bx) * (ay1 - ay);
If ( u_b <> 0 )
ua = ua_t / u_b;
ub = ub_t / u_b;
If ( 0 <= ua And ua <= 1 And 0 <= ub And ub <= 1 )
Else
Local Localdist#[3], distminimum# = MAXdistance
Localdist[0] = DistancePointToLine#(ax#, ay#, bx, by, bx1, by1)
If Localdist[0] <=0 Return 0
Localdist[1] = DistancePointToLine#(ax1, ay1, bx, by, bx1, by1)
If Localdist[1] <=0 Return 0
Localdist[2] = DistancePointToLine#(bx#, by#, ax, ay, ax1, ay1)
If Localdist[2] <=0 Return 0
Localdist[3] = DistancePointToLine#(bx1#, by1#, ax, ay, ax1, ay1)
If Localdist[3] <=0 Return 0
For k = 0 To 3
If Localdist[k] < distminimum Then distminimum = Localdist[k]
Next
Return distminimum
EndIf
EndIf
End Function
;_____________________________________________________
Function DistanceRectToRect#(cx#, cy#, cw#, ch#, ox#, oy#, ow#, oh#)
Local Localoct
If(cx + cw <= ox)
If(cy + ch <= oy)
Localoct = 0
Else If(cy => oy + oh)
Localoct = 6
Else
Localoct = 7
End If
Else If(cx => ox + ow)
If(cy + ch <= oy)
Localoct = 2
Else If(cy => oy + oh)
Localoct = 4
Else
Localoct = 3
End If
Else If(cy + ch <= oy)
Localoct = 1
Else If(cy => oy + oh)
Localoct = 5
Else
Return 0
End If
Select Localoct ; Determin Distance based on Quad
Case 0
cx = (cx + cw) - ox
cy = (cy + ch) - oy
Return -(cx + cy)
Case 1 : Return -((cy + ch) - oy)
Case 2
cx = (ox + ow) - cx
cy = (cy + ch) - oy
Return -(cx + cy)
Case 3 : Return -((ox + ow) - cx)
Case 4
cx = (ox + ow) - cx
cy = (oy + oh) - cy
Return -(cx + cy)
Case 5
Return -((oy + oh) - cy)
Case 6
cx = (cx + cw) - ox
cy = (oy + oh) - cy
Return -(cx + cy)
Case 7 : Return -((cx + cw) - ox)
End Select
End Function
;_____________________________________________________