Разобрался с проблемой:
Дело было в граничных условиях - если прямо на границу описанной окружности ложились еще точки, то функция выдавала 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