Форум: "Игры";
Текущий архив: 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.066 c