Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.036 c
2-1191150933
SveTTT
2007-09-30 15:15
2007.10.21
Привязка клавиатуры к кнопкам, у которых используется Tag


15-1190615735
БарЛог
2007-09-24 10:35
2007.10.21
Проблема при установке Win 2003, XP...


2-1191255641
Jkt
2007-10-01 20:20
2007.10.21
Переобразование xls в dbf4


2-1190787716
F@T@L_Err0r
2007-09-26 10:21
2007.10.21
Desktop lock


2-1191237333
matt
2007-10-01 15:15
2007.10.21
Ini-файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский