Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Узнать угол по трём точкам


Автор: TDM 11.5.2006, 21:31
Даны координаты трёх точек (с1,с2,с3) Узнать угол между ними в градусах. Подскажите как. 

Автор: Fin 11.5.2006, 22:14
Можно поиграться с формулой теоремы косинусов:
A^2=B^2+C^2-2*A*B*Cos(Alfa) 

Автор: maxim1000 11.5.2006, 22:21
переделываем это в два вектора: c2c1 и c2c3
находим их длины (корень из суммы квадратов)
находим векторное произведение
делим на длины векторов
получаем синус угла... 

Автор: Magister Y0da 12.5.2006, 07:35
Можно обыкновенные координаты перевести в полярные и все 

Автор: SoWa 12.5.2006, 13:23
Можно поизвращаться с уравнениями прямых. Извлечь оттуда тангенсы угла наклона, и из большего вычесть меньший угол.
Но лучше делать так, как предложил maxim1000.
2JIAMEP, глупо. С уравнениями прямых и то легче. С сисетмами координат будешь возиться долго. И еще: так можно было бы решать. если бы вершина угла была в нуле. А так она где угодно. И поэтому задачу так не решить. 

Автор: maxim1000 12.5.2006, 16:23
если уж сравнивать, то мне кажется, что для углов, близких к 0 и 180 стоит использовать векторное произведение, а для близких к 90 - скалярное (т.е. через теорему косинусов)
причина - точность: в первом случае arcsin точнее, а во втором - arccos

общее правило может быть таким:
берём любой из двух методов, определяем угол, если он получился из "чужой" области применения - берём другой метод 

Автор: 6TITLIZ 12.5.2006, 17:15
Код

  Al := arcsin((2 * S)/(AB*CA));
  Al := (180/pi)*Al;


S - площадь
AB CA - стороны

Почему у меня не правильно определяется градус тупого угла? С острыми и прямыми проблем нет 

Автор: poor_yorik 12.5.2006, 19:23
 Потому что арксинус не работает с тупыми углами, вместо этого у тебя будет отрицательный угол, и тебе над будет прибавить к нему 180 градусов. 

Автор: 6TITLIZ 12.5.2006, 20:25
poor_yorik, Как быть? smile 

 smile  

Автор: TDM 12.5.2006, 22:43
Наверное так:
Код

IF Al<0 then
 Inc(AI,180);
 

Автор: 6TITLIZ 13.5.2006, 12:14
Он мне выдает Al=36 (пример) А нужно 180-36. Угол тупой, а он выдаёт как острый.
Тут проверкой дело не спасёшь... 

Автор: TDM 28.5.2006, 19:22
Напишите пример. 

Автор: Earnest 30.5.2006, 17:56
Нужно свычислять и синус, и косинус (т.е. пропорциональные им величины), и определять угол с учетом знака обоих. Не знаю как в Паскале, а в С есть ф-я atan2, которая это умеет.
Т.е. получается что-то вроде 
Код

phi = atan2 (<векторное произведение>,<скалярное произведение>);
 

Автор: Magister Y0da 31.5.2006, 13:53
Скажим С2 соединяется с обеими точками. 
Тогда С1(С1(Х1)-C2(X2),С1(Y1)-C2(Y2)), С3(С3(Х3)-C2(X2),С3(Y3)-C2(Y2))
и переводим в полярные

зайди туда, там есть формула
http://www.ssga.ru/AllMetodMaterial/metod_mat_for_ioot/metodichki/iutina/1_AG.html#2 

поиск через rambler "нахождения угла" вторая ссылка 

Автор: 6TITLIZ 15.6.2006, 15:15
А можно как нибудь заранее определить: тупой или острый угол?
Код

 Al := arcsin((2 * S)/(AB*CA));
 Al := Al * 57; - острый 
или 
Al := 180 - (Al*57); - тупой


И вопрос в догонку: Как можно округлить градусную меру до минут?
Чтоб можно было выводить 45* 17" 

Автор: maxim1000 15.6.2006, 15:22
Цитата(6TITLIZ @  15.6.2006,  14:15 Найти цитируемый пост)
А можно как нибудь заранее определить: тупой или острый угол?

тут достаточно посмотреть на знак скалярного произведения:
минус - тупой
плюс - острый 

Автор: 6TITLIZ 15.6.2006, 15:23
А как этот знак получить? 

Автор: SoWa 15.6.2006, 16:07
Ну косинус посчитать, очевидно.
Код

a*b=abs(a)*abs(b)*cos(x);
a*b=x*x1 + y*y1 + z*z1;
x*x1 + y*y1 + z*z1=abs(a)*abs(b)*cos(x);
cos(x)=( x*x1 + y*y1 + z*z1 )/(abs(a)*abs(b))

Значки векторов опущены.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)