Главная страница
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.018 c
2-1190481611
Yogan
2007-09-22 21:20
2007.10.21
idsmtpserver


2-1190891450
Yogan
2007-09-27 15:10
2007.10.21
Многопоточность


2-1191224656
Lexx1
2007-10-01 11:44
2007.10.21
.ini не создается(


2-1190800205
max-wo
2007-09-26 13:50
2007.10.21
TStrings - TStringList


2-1190726454
R.O.O.T
2007-09-25 17:20
2007.10.21
Обработка исключений в TSocketConnection