- Код: Выделить всё
program Project1;
uses
sysutils;
const
eps=1e-14;
type
GDBvertex2DI=record
x,y:integer;
end;
function distance2line(var q:GDBvertex2DI;var p1,p2:GDBvertex2DI): double;
var t,w,p2x_p1x,p2y_p1y,qx_p1x,qy_p1y,qy_p2y,qx_p2x: double;
begin
p2x_p1x:=p2.x-p1.x;
p2y_p1y:=p2.y-p1.y;
qx_p1x:=q.x-p1.x;
qx_p2x:=q.x-p2.x;
qy_p1y:=q.y-p1.y;
qy_p2y:=q.y-p2.y;
if((qx_p1x)*(p2x_p1x)+(qy_p1y)*(p2y_p1y))*((qx_p2x)*(p2x_p1x)+(qy_p2y)*(p2y_p1y))>-eps then
begin
t:= sqr(qx_p1x)+sqr(qy_p1y);
w:= sqr(qx_p2x)+sqr(qy_p2y);
if w<t then t:= w;
end else
t:= sqr((qx_p1x)*(p2y_p1y)-(qy_p1y)*(p2x_p1x))/(sqr(p2x_p1x)+sqr(p2y_p1y));
result:= sqrt(t);
end;
var
q,p1,p2:GDBvertex2DI;
dist:double;
myTime:TDateTime;
ts:string;
i:integer;
begin
q.x:=100;q.y:=100;
p1.x:=0;p1.y:=0;
p2.x:=1000000;p2.y:=1000000;
myTime:=now;
//for i:=0 to 1000000 do //раскоментируй бкдет время потраченое на 1000000 линий.
dist:=distance2line(q,p1,p2);
str((now-myTime)*10e4:2:3,ts);
if abs(dist)<eps then
writeln('Point on line')
else
writeln('Point not on line');
writeln(ts+'sec.');
readln;
end.
Только пожалуйста именно для линии 0,0-1000000,1000000. Художники, вперед!