Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.30;
Скачать: CL | DM;

Вниз

Как узнать на какой угол повернута...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
14-99757
Rafe
2003-12-07 02:46
2003.12.30
Сайт для он-лайн слежкой за результатами выборов...


3-99435
RMM58
2003-12-07 01:55
2003.12.30
в DBF из XML


1-99611
СержК
2003-12-17 10:16
2003.12.30
Количество вхождений подстроки в строку


8-99659
VISA
2003-08-29 16:46
2003.12.30
Проиграть midi в фоновом режиме


14-99715
Думкин
2003-12-08 08:43
2003.12.30
Встреча в Новосибирске. Отчет