Главная страница
    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.043 c
4-1176883424
evgenij_
2007-04-18 12:03
2007.10.21
Stay on Top


15-1190563931
ProgRAMmer Dimonych
2007-09-23 20:12
2007.10.21
Поддскажите, плз, самое простое и быстрое решение...


2-1190619662
F@T@L_Err0r
2007-09-24 11:41
2007.10.21
TrackBar


15-1190213316
sdubaruhnul
2007-09-19 18:48
2007.10.21
А какой там сайт был...


2-1191039352
Washington
2007-09-29 08:15
2007.10.21
Что за ошибка?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский