Был вариант, когда я и не учитывал точки, не попавшие в треугольник. Тот же результат. Правда при количестве точек 5e+7 вроде более менее одинаковые результаты. Но это как то не спортивно...
недостающие функции:
Код:
type RealType=double;
type Dot=record
x,y:RealType;
function GetPolynom(xx,yy,ga,gb,gc,gd,ge,gf:RealType;gblockno:integer;
IsBound:boolean=false): RealType;
begin
Result:=ga+gb*xx+gc*yy+gd*xx*yy+ge*sqr(xx)+gf*sqr(yy)
end;
function OnLine(TestPoint,X1,X2:Dot):boolean;
var ok,ob:RealType;
begin
ok:=(x1.Y-x2.y)/(X1.X-x2.x);
ob:=(x2.Y*x1.x-x1.Y*x2.x)/(x1.X-x2.x);
Result:=(abs(TestPoint.Y-(ok*TestPoint.X+ob))<1e-13) and
((testpoint.x>=min(x1.x,x2.x)) and
(testpoint.x<=max(x2.x,x1.x))) and ((testpoint.y>=min(x1.y,x2.Y)) and
(testpoint.y<=max(x2.y,x1.Y)));
end;
function Orientation(Dot1,bDot,eDot,cDot:Dot):Integer;
var oa,ob,oc:Dot;
sa,sb:RealType;
begin
oa.x:=eDot.x-bDot.X;
oa.y:=eDot.y-bDot.y;
ob.x:=Dot1.x-bDot.X;
ob.y:=Dot1.y-bDot.y;
oc.X:=cDot.X-bDot.X;
oc.y:=cDot.y-bDot.y;
//a. x * b.y - b.x * a.y;
sa:=oa.x*ob.y-ob.x*oa.y;
sb:=oa.x*oc.y-oc.x*oa.y;
Result:=0;// otherwise
if (sa*sb>=0) then Result:=-1; //left
end;
function InTri(TestPoint,Tria,Trib,Tric:Dot):boolean;
begin
Result:=(Orientation(TestPoint,Tria,Trib,Tric)=-1) and
(Orientation(TestPoint,Trib,Tric,Tria)=-1) and
(Orientation(TestPoint,Tric,Tria,Trib)=-1) or
OnLine(TestPoint,Tria,Trib) or OnLine(TestPoint,Tria,Tric) or
OnLine(TestPoint,TriB,TriC)
end;
GetDerivative - возвращает константу.
Тестировал на треугольнике
(0,54030230587, 0,84147098481)
(0,4782535689, 0,74549535193)
(0,48028810795, 0,87711078739)
значения коэффициентов полинома
aa=144,40721255
bb=-152,03135368
cc=-256,00702271
dd=134,64505084
ee=39,979898071
ff=113,36503213