Показать сообщение отдельно
Старый 25.10.2011, 21:59   #3
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений
(для 6,854 пользователей)
Ответ: Точка в четырёхугольнике

Function PointInPolypoint_x:Floatpoint_y:Floatxy:Float[] )
    
    If 
xy.length<Or (xy.length&1) Return False
    
    Local x1
:Float=xy[xy.Length-2]
    
Local y1:Float=xy[xy.Length-1]
    
Local cur_quad:Int=GetQuad(point_x,point_y,x1,y1)
    
Local next_quad:Int
    Local total
:Int
    
    
For Local i=0 Until Len xy Step 2
        Local x2
:Float=xy[i]
        
Local y2:Float=xy[i+1]
        
next_quad=GetQuad(point_x,point_y,x2,y2)
        
Local diff:Int=next_quad-cur_quad
        
        Select diff
        
Case 2,-2
            
If ( x2 - ( ((y2 point_y) * (x1 x2)) / (y1 y2) ) )<point_x
                diff
=-diff
            
EndIf
        Case 
3
            diff
=-1
        
Case -3
            diff
=1
        End Select
        
        total
:+diff
        cur_quad
=next_quad
        x1
=x2
        y1
=y2
    Next
    
    
If Abs(total)=4 Then Return True Else Return False
EndFunction

Function GetQuad(axis_x:Float,axis_y:Float,vert_x:Float,vert_y:Float)
    If 
vert_x<axis_x
        
If vert_y<axis_y
            
Return 1
        
Else
            Return 
4
        
EndIf
    Else
        If 
vert_y<axis_y
            
Return 2
        
Else
            Return 
3
        
EndIf    
    EndIf

EndFunction 
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
moka (27.10.2011), NitE (25.10.2011)