Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.21;
Скачать: CL | DM;

Вниз

Поворот четырёхугольника.   Найти похожие ветки 

 
Ekzot   (2006-10-24 14:04) [0]

Есть четырёхугольник.
Какой формулой можно вычеслить премещение его основных точек при любом угле поворота.


 
Shirson ©   (2006-10-24 16:37) [1]

Допустим, четырёхугольник описан 4 точками (вершинами). Координаты точек отсчитываются относительно некоего центра.
Для поворота всего четырёхугольника, достоточно сделать с каждой вершиной:
x:=p.x*sin(a);
y:=p.y*cos(a);

где:
p.x и p.y - координаты вершины четырёхугольника.
x и y - новые координаты точки после поворота.
а - угол поворота.

Для поворота относительно любой точки, достоточно сделать с каждой вершиной:
x:=(p.x+dx)*sin(a);
y:=(p.y+dy)*cos(a);
где:
dx и dy координаты точки, относительно которой нужно певернуть фигуру.


 
Shirson ©   (2006-10-24 16:43) [2]

Хм... подтормозил малость.
Посмотрел свой модуль для операций с многогранниками:


function RotateDot(Dot:TBaseV; Angle:Single):TBaseV; overload;
var sinA,cosA:single;
begin
 sinA:=sin(Angle);
 cosA:=cos(Angle);
 Result.x:=Dot.x*cosA-Dot.y*sinA;
 Result.y:=Dot.y*cosA+Dot.x*sinA;
end;


TBaseV аналог TPoint, только для вещественных координат.


function RotateDot(Dot:TBaseV; Angle:Single; Center:TBaseV):TBaseV; overload;
begin
 Result:=rotateDot(VSub(Dot,Center),angle);
end;


Первая функция возвращает новые коорюинаты точки после вращения. Вторая - тоже самое, только относительно заданного центра.

function VSub(V1,V2:TBaseV):TBaseV;
begin
 Result.x:=V1.x-V2.x;
 Result.y:=V1.y-V2.y;
end;


 
Shirson ©   (2006-10-24 16:52) [3]

раз пошла такая пьянка, лови в довесок.


 TBaseV = record
   x,y:single;
 end;

 TPoly = array of TBaseV;

function VSum(V1,V2:TBaseV):TBaseV;
begin
 Result.x:=V1.x+V2.x;
 Result.y:=V1.y+V2.y;
end;

function RotatePoly (Poly:TPoly; Angle:single):TPoly;overload;
var a:integer;
   sinA,cosA:single;
   p:TPoly;
begin
 setlength(p,high(poly)+1);
 sinA:=sin(Angle);
 cosA:=cos(Angle);
 for a:=0 to high(Poly) do
   begin
     p[a].x:=Poly[a].x*cosA-Poly[a].y*sinA;
     P[a].y:=Poly[a].y*cosA+Poly[a].x*sinA;
   end;
   result:=p;
end;

function RotatePoly (Poly:TPoly; Angle:single; Center:TBaseV):TPoly;overload;
var a:integer;
   sinA,cosA:single;
   tp:TBaseV;
   p:TPoly;
begin
 setlength(p,high(poly)+1);
 sinA:=sin(Angle);
 cosA:=cos(Angle);
 for a:=0 to high(Poly) do
   begin
     tp:=VSub(Poly[a],Center);
     p[a].x:=tp.x*cosA-tp.y*sinA;
     P[a].y:=tp.y*cosA+tp.x*sinA;
     P[a]:=VSum(p[a],Center);
   end;
 result:=p;
end;



Страницы: 1 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.021 c
6-1163414321
anis
2006-11-13 13:38
2007.10.21
Как отобразить ход выполнения закачки IdFTP?


8-1168425391
cautur
2007-01-10 13:36
2007.10.21
Запись разговора


4-1176956104
roughneck
2007-04-19 08:15
2007.10.21
Подсказки


2-1191037024
Washington
2007-09-29 07:37
2007.10.21
Вызов процедуры


2-1190878723
Kolan
2007-09-27 11:38
2007.10.21
Как заблокировать TreeView?