Показать сообщение отдельно
Старый 19.02.2013, 16:32   #11
A_Z
Оператор ЭВМ
 
Аватар для A_Z
 
Регистрация: 15.11.2010
Сообщений: 43
Написано 19 полезных сообщений
(для 45 пользователей)
Ответ: Новый 3d редактор RiFLe - вопрос к математикам

Разобрался с проблемой:
Дело было в граничных условиях - если прямо на границу описанной окружности ложились еще точки, то функция выдавала true. Чтоб обойти это, в таком случае сортируем точки по величине угла к центру окружности (помог Atan2), чтоб узнать, в каком случае включать их, а в каком нет. Заодно это приводит к некоторому порядку в прорисовке треугольников

Function InCircle4(xp#, yp#, x1#, y1#, x2#, y2#, x3#, y3#, xc#, yc#, r#)

If ((xp#=x1#) And (yp#=y1#)) Or ((xp#=x2#) And (yp#=y2#)) Or ((xp#=x3#) And (yp#=y3#)) Return False

Edge1X# = X2# - X1#
Edge1Y# = Y2# - Y1#

Edge2X# = X3# - X1#
Edge2Y# = Y3# - Y1#

Edge3X# = X3# - X2#
Edge3Y# = Y3# - Y2#

Point1X# = X1# + X2#
Point1Y# = Y1# + Y2#

Point2X# = X1# + X3#
Point2Y# = Y1# + Y3#

Alpha1# = Edge1X# * Point1X# + Edge1Y# * Point1Y#
Alpha2# = Edge2X# * Point2X# + Edge2Y# * Point2Y#

Scale# = 0.5 / ( Edge1X# * Edge3Y# - Edge1Y# * Edge3X# )

CenterX# = ( Edge2Y# * Alpha1# - Edge1Y# * Alpha2# ) * Scale#
CenterY# = ( Edge1X# * Alpha2# - Edge2X# * Alpha1# ) * Scale#

radius#=Sqr((CenterX#-x1#)^2+(CenterY#-y1#)^2)
rasst#=Sqr((CenterX#-xp#)^2+(CenterY#-yp#)^2)

If rasst#<radius# Then Return True
If rasst#>radius# Then Return False

If rasst#=radius#
	angle#=ATan2(CenterY#-YP#,CenterX#-XP#)
	If (angle#>=90 And angle#<180) Or (angle#=>-90 And angle#<0)
		Return True
	Else
		Return False
	EndIf
EndIf

End Function
__________________
Человек с оружием.
(Offline)
 
Ответить с цитированием