Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново...

Ответ
 
Опции темы
Старый 24.12.2015, 14:08   #1
polopok
ПроЭктировщик
 
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений
(для 71 пользователей)
Сообщение дистанции 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
;_____________________________________________________
__________________
Мой проект здесь
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо polopok за это полезное сообщение:
Nerd (24.12.2015), St_AnGer (24.12.2015)
Старый 24.12.2015, 17:26   #2
L-ee-X
Разработчик
 
Аватар для L-ee-X
 
Регистрация: 06.06.2011
Адрес: Ирк. обл.
Сообщений: 541
Написано 133 полезных сообщений
(для 220 пользователей)
Ответ: дистанции 2д

Это все понятно. Но зачем это уже нужно?
__________________
(Offline)
 
Ответить с цитированием
Старый 26.12.2015, 16:05   #3
polopok
ПроЭктировщик
 
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений
(для 71 пользователей)
Ответ: дистанции 2д

Кому не нужно ,не нужно , кому нужно ,вот оно.
__________________
Мой проект здесь
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com