Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
1-99556
Builder
2003-12-17 16:58
2003.12.30
Word


3-99434
Zhenja
2003-12-04 00:21
2003.12.30
Работа с локальной базой по сети


14-99696
Rihter
2003-12-07 21:14
2003.12.30
ICQ и IRC через www интерфейс


7-99799
-= Zerg =-
2003-10-23 10:50
2003.12.30
как узнать путь к temp папке


1-99542
MisterJ
2003-12-16 10:52
2003.12.30
Delphi5+ExcelXP





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