Главная страница
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.02 c
6-1171959552
santey
2007-02-20 11:19
2007.10.21
Как установить статический ип на сетевом адаптере


2-1190789736
l_v
2007-09-26 10:55
2007.10.21
ServerSocket


2-1190812703
Malik
2007-09-26 17:18
2007.10.21
Application


2-1191050467
Washington
2007-09-29 11:21
2007.10.21
Сортировка


2-1191236976
Mishenka
2007-10-01 15:09
2007.10.21
Цвет фона в ячейках StringGrid а