как оперделить длину отрезка AB если известны координаты отрезка
Function Dlina(a,b:Tpoint):real;
var x1,y1,x2,y2:real;
begin
x1:=a.x;
y1:=a.y;
x2:=b.x;
y2:=b.y;
result:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
end;
как определить угол наклона отрезка A B в координатах
uses math;
Function Ugol(a,b:Tpoint):real;
var Ch:integer;
begin
result:=arctan2((a.y-b.y),(a.x-b.x));
end;
как создать векторный объект
type
TMyObject=record
cx,cy:integer; // Центр фигуры
h,w:integer; // Высота и ширина объекта
n:integer; // кол-во вершин
m:array of Tpoint; // массив точек векторного объекта
end;
определим векторный объект
var pr:TMyObject; // Прямоугольник
напишем процедуру создания векторного объекта
cx,cy - центр объекта h,W - Ширина и высота объекта a1 - начальный угол поворота
Function CreateMyObject4(cx,cy,h,w:integer;a1:integer):TMyObject; const n=4; var an,a:real; r:Extended; x:integer; h1,x1,y1:integer; begin a:=360/n; r:=SQRT(w*w+h*h); result.cx:=cx; result.cy:=cy; result.n:=n; if length(result.m)<n then setlength(result.m,n+1); an:=a1; r:=r/2; for x:=0 to n-1 do begin if x=0 then begin x1:=round(cx+r*cos((360-arctan(h/w)*180/pi+a1)*pi/180)); y1:=round(cy+r*sin((360-arctan(h/w)*180/pi+a1)*pi/180)); form1.Image1.Canvas.MoveTo(cx,cy); form1.Image1.Canvas.Lineto(x1,y1); end else begin an:=an+a; if (x mod 2) <> 0 then h1:=h else h1:=w; x1:=round(x1+h1*cos(an*pi/180)); y1:=round(y1+h1*sin(an*pi/180)); end; result.m[x].X:=x1; result.m[x].y:=y1; end; result.m[n].X:=result.m[0].X; result.m[n].y:=result.m[0].y; end;
создадим процедуру поворота векторного объекта вокруг определенной точки
Procedure Povorot(var Val:TMyObject;cx,cy:integer;a:integer); var i:integer;n:integer; d1:real; // расстояние от точки cx,cy до точки объекта a1:real; // текущий угол наклона x1,y1:integer; // новый угол поворота begin n:=val.n;
d1:=Dlina(point(val.cx,val.cy),point(cx,cy)); a1:=Ugol(point(val.cx,val.cy),point(cx,cy)); // перетаскиваем центр тяжести объекта val.cx:=cx+round(d1*cos(a1+a*pi/180)); val.cy:=cy+round(d1*sin(a1+a*pi/180));
for I:=0 to n-1 do begin d1:=Dlina(point(val.m[i].x,val.m[i].y),point(cx,cy)); a1:=Ugol(point(val.m[i].x,val.m[i].y),point(cx,cy)); x1:=cx+Round(d1*cos(a1+a*pi/180)); y1:=cy+Round(d1*sin(a1+a*pi/180)); val.m[i].X:=x1; val.m[i].y:=y1; end; val.m[n].X:=val.m[0].X; val.m[n].y:=val.m[0].y; end;
процедура перерисовки нашего векторного объекта выглядит просто
form1.Image1.Canvas.Polygon(pr.m); form1.Image1.Canvas.Rectangle(pr.cx-5,pr.cy-5,pr.cx+5,pr.cy+5); // центр векторного объекта пример ниже
решил написать второй пример поворот многоугольника вокруг точки на Delphi Pascal с возможностью переноса точки центра вращения мышью /59_povorot_vokrug_tochki.zip