forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   дистанции 2д (http://forum.boolean.name/showthread.php?t=20136)

polopok 24.12.2015 14:08

дистанции 2д
 
Вычисление и возврат дистанции между формами(объектами)

код под спойлером :

Код:

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
;_____________________________________________________


L-ee-X 24.12.2015 17:26

Ответ: дистанции 2д
 
Это все понятно. Но зачем это уже нужно?

polopok 26.12.2015 16:05

Ответ: дистанции 2д
 
Кому не нужно ,не нужно , кому нужно ,вот оно.


Часовой пояс GMT +4, время: 14:07.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot