Форум: "Игры";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
ВнизКак узнать на какой угол повернута... Найти похожие ветки
← →
Land (2003-06-03 20:56) [0]Как узнать на какой угол повернута данная точка относительно другой точки? То есть есть алгоритм с помощью которого можно повернуть данную точку отноносительно другой точки если известны ее координаты:
function RotatePoint(P,Center:TPoint;Angle:integer):TPoint;
var
Temp: TPoint;
begin
Temp:=Point(P.X-Center.X,P.Y-Center.Y);
Temp.X :=Trunc(Temp.X*Cos(Angle)-Temp.Y*Sin(Angle));//сам поворот
Temp.Y :=Trunc(Temp.X*Sin(Angle)+Temp.Y*Cos(Angle));
result:=Point(Temp.X+Center.X,Temp.Y+Center.Y);
end;
Но! Как же узнать на КАКОЙ угол повенута точка относительно данной(центра) если известны их координаты??? Заранее спасибо!
← →
Плохой человек (2003-06-03 22:35) [1]По нашей системе образования - 9-ый класс. Вот чертёж:
|--a--* (x1,y1)
| /
b ( x2,y2) [1]По нашей системе образования - 9-ый класс. Вот чертёж:
|--a--* (x1,y1)
| /
b c
| /
| /
|/
* (x2,y2)
Как видишь, задача сводится к решению прямоугольного треугольника, т.е., через синус можно, через косинус или через тангенс. Ну, понятно, что a = x1-x2; b= y2-y1; c = sqrt(a^2 + b^2);
← →
Думкин (2003-06-04 05:11) [2]Все не так. Объснись - что значит точка повернута отнсительно другой? Хотя бы иногда и думать надо.
← →
MeF88 (2003-06-04 06:57) [3]Точка повернута относительно другой быть не может... Вот перефразированное условие. Найти координаты точки некоторой окружности полученной путем поворота окружности относительно центра окружности, если известен угол поворота и координаты точки совпадающей с данной точкой до поворота. =)
← →
Land (2003-06-04 14:56) [4]Ага! Понятно, всем спасибо!
← →
Плохой человек (2003-06-04 22:00) [5]>Объснись - что значит точка повернута отнсительно другой? Хотя бы иногда и думать надо.
Понятно, что угол между тремя точками. Но так же понятно, что здесь имелся ввиду угол по часовой стрелке ну как раз по окружности.
← →
Плохой человек (2003-06-04 23:27) [6]М-да, вопрос по сложнее, чем я думал. Если идти по моему способу, то нужно определять, в каких четвертях находитя точка. Недавно самоу понадобилось определить угол поворота точки. Есть формула поворота:
xn := round( (x - x1)*Cos(pi/180*ф)-(y - y1)*Sin(pi/180*ф) + x1 );
yn := round( (x - x1)*Sin(pi/180*ф)+(y - y1)*Cos(pi/180*ф) + y1 );
// x1, y1 - центр, x, y - старые координаты.
Попытался выразить угол - не хватило мозгов. Кто-нибудь решите, а то не только одному Land надо.
← →
reticon (2003-06-05 00:31) [7]http://mirgames.ru/texts/common/article1.phtml?PHPSESSID=d42c0d19c1c6b0009906ec606cc40b67
← →
Думкин (2003-06-05 05:15) [8]
> Плохой человек (04.06.03 22:00)
> Понятно, что угол между тремя точками. Но так же понятно,
> что здесь имелся ввиду угол по часовой стрелке ну как раз
> по окружности.
А третья откуда нарисовалась?
А часовая куда крутится? от Х к У или от У к Х?
По какой окружности?
Вопрос еще сложнее чем ты предполагаешь - он просто не корректен.
← →
Плохой человек (2003-06-05 20:27) [9]> А третья откуда нарисовалась?
А часовая куда крутится? от Х к У или от У к Х?
По какой окружности?
Вопрос еще сложнее чем ты предполагаешь - он просто не корректен.
Я согласен, что вопрос некорректен, просто у меня в мыслях было определение угла по часовой, вот я и сразу понял вопрос так. Ты бы лучше меня не корил, а формулу вывел.
2 Reticon:
Ну вот это примерно то, что я тогда показал, но тут опять таки проблема с углом больше 90 градусов. Нужно определять, в какой из четвертей лежит этот трегуольник и добавлять 90 градусов на каждую часть. Видимо, мне придётся так и делать.
← →
aldor (2003-06-05 22:00) [10]
cos(alpha) = (x1*x2 + y1*y2) / sqrt((x1^2 + y1^2)*(x2^2 + y2^2))
← →
Плохой человек (2003-06-05 22:59) [11]2 aldor:
Именно то, что было надо...
2 All:
А я написал ту же хрень, только на начальных знаниях синусов, косинусов и тангенсов. Работает ОК, проверено:
function GetAzimuth(Center: TPoint; Pointer: TPoint): Integer;
begin
Result := 0;
If (Pointer.x > Center.x) and (Pointer.y < Center.y) then
begin
Result := Round(RadToDeg(ArcTan(Abs(Pointer.x-Center.x)/Abs(Center.y-Pointer.y))));
end;
If (Pointer.x > Center.x) and (Pointer.y > Center.y) then
begin
Result := 90 + Round(RadToDeg(ArcTan(Abs(Pointer.y-Center.y)/Abs(Center.x-Pointer.x))));
end;
If (Pointer.x < Center.x) and (Pointer.y > Center.y) then
begin
Result := 180 + Round(RadToDeg(ArcTan(Abs(Pointer.x-Center.x)/Abs(Center.y-Pointer.y))));
end;
If (Pointer.x < Center.x) and (Pointer.y < Center.y) then
begin
Result := 270 + Round(RadToDeg(ArcTan(Abs(Pointer.y-Center.y)/Abs(Center.x-Pointer.x))));
( Center.x = Pointer.x) [11] 2 aldor:
Именно то, что было надо...
2 All:
А я написал ту же хрень, только на начальных знаниях синусов, косинусов и тангенсов. Работает ОК, проверено:
function GetAzimuth(Center: TPoint; Pointer: TPoint): Integer;
begin
Result := 0;
If (Pointer.x > Center.x) and (Pointer.y < Center.y) then
begin
Result := Round(RadToDeg(ArcTan(Abs(Pointer.x-Center.x)/Abs(Center.y-Pointer.y))));
end;
If (Pointer.x > Center.x) and (Pointer.y > Center.y) then
begin
Result := 90 + Round(RadToDeg(ArcTan(Abs(Pointer.y-Center.y)/Abs(Center.x-Pointer.x))));
end;
If (Pointer.x < Center.x) and (Pointer.y > Center.y) then
begin
Result := 180 + Round(RadToDeg(ArcTan(Abs(Pointer.x-Center.x)/Abs(Center.y-Pointer.y))));
end;
If (Pointer.x < Center.x) and (Pointer.y < Center.y) then
begin
Result := 270 + Round(RadToDeg(ArcTan(Abs(Pointer.y-Center.y)/Abs(Center.x-Pointer.x))));
end;
If (Center.x = Pointer.x) and (Pointer.y < Center.y) then Result := 0;
If (Center.x = Pointer.x) and (Pointer.y > Center.y) then Result := 180;
If (Center.y = Pointer.y) and (Pointer.x > Center.x) then Result := 90;
If (Center.y = Pointer.y) and (Pointer.x < Center.x) then Result := 270;
end;
← →
Думкин (2003-06-06 05:32) [12]> Плохой человек (05.06.03 20:27)
Формулу я выводить не буду - при четкой постановке вопроса я нарисую ее за 30 секунд.
Проблема не в ответе, а в опросе. Пока не будет четкого вопроса - все ответы в никуда.
← →
Думкин (2003-06-06 05:42) [13]
> Я согласен, что вопрос некорректен
А если согласен - зачем тогда?
Некорректность вопроса подразумевает:
1. Отсутствие решения.
2. Неоднозначность решения.
3. Ну это из другой песни.
← →
Плохой человек (2003-06-06 18:23) [14]2 Думкин:
Забей, мне всё ранво надо было решать тот же вопрос. Вот я и воспользовался случаем.
← →
Bones (2003-06-07 08:24) [15]2 Land:
Как одна точка может быть повернута относительно другой на какой-то угол????? Может я чего-то не догоняю.
← →
Плохой человек (2003-06-07 17:18) [16]2 Bones:
Имелся ввиду азимут.
← →
Fenik (2003-06-08 12:48) [17]> Плохой человек (05.06.03 22:59)
Всё проще:
uses Math;
function GetAngle(const Center, Pointer: TPoint): Double;
begin
Result := ArcTan2(Center.y - Pointer.y, Pointer.x - Center.x) * (180 / Pi);
if Result < 0 then Result := Result + 360;
end;
← →
Плохой человек (2003-06-08 19:35) [18]2 Fenik:
Отлично...
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c