Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2009, 17:59   #1
Алён@
Пользователь
 
Аватар для Алён@
 
Регистрация: 15.01.2009
Сообщений: 43
По умолчанию Не могу понять в чем ошибка (вроде школьная математика)

Задача посчитать углы между тремя отрезками с общей вершиной. Известны координаты вершин отрезков.
вот код вычисления угла между двумя отрезками (p1 - общая вершина, p2,p3 - несмежные вершины каждого из отрезков:

function CalcAngle(p1,p2,p3:TPoint):extended ;
var
a,b,c:extended;
begin
a:=Length_of_segment(p1.X,p1.Y,p2.X ,p2.Y);
b:=Length_of_segment(p1.X,p1.Y,p3.X ,p3.Y);
c:=Length_of_segment(p2.X,p2.Y,p3.X ,p3.Y);
CalcAngle:=ArcCos((a*a+b*b-c*c)/(2*a*b))*180/pi;
end;

Вроде школьная математика, но не могу понять, в чём дело. Когда все углы между отрезками больше 90град, то всё нормально: сумма всех углов в точности равна 360, а когда хотя бы один из углов меньше 90 градусов, то сумма углов может значительно отклоняться от 360. Почему?

На всякий случай весь код во вложеном файле.

// углы между отрезками от 0 до 180 град
Вложения
Тип файла: zip код.zip (5.0 Кб, 11 просмотров)

Последний раз редактировалось Алён@; 10.03.2009 в 18:02.
Алён@ вне форума Ответить с цитированием
Старый 10.03.2009, 19:33   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Ну дык, сумма и не обязана быть равна 360 градусам. Углом между лучами называется НАИМЕНЬШИЙ из углов, образованных прямыми, содержащими эти лучи. И область значений арккосинуса - это [0, pi]
Кстати непонятно зачем вы высчитываете третью сторону, если можно через скалярное произведение
Код:
cos(alpha) = (x1*x2 + y1*y2) / (|a1| * |a2|)
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 10.03.2009, 19:40   #3
Алён@
Пользователь
 
Аватар для Алён@
 
Регистрация: 15.01.2009
Сообщений: 43
По умолчанию

Да, точно, можно и так. Забыла. Со случаем на рис 3 понятно как. Всё норамально в случ на рис 2. А вот на рис 3 (когда только 1 угол острый) проблема: например, получилось 138+ 27+ 165=330 <>360!
Изображения
Тип файла: jpg 1.jpg (3.2 Кб, 153 просмотров)
Тип файла: jpg 3.jpg (3.5 Кб, 154 просмотров)
Тип файла: jpg 2.jpg (2.6 Кб, 157 просмотров)
Алён@ вне форума Ответить с цитированием
Старый 10.03.2009, 19:44   #4
Алён@
Пользователь
 
Аватар для Алён@
 
Регистрация: 15.01.2009
Сообщений: 43
По умолчанию

Я не через скалярное произведение шла, т.к у меня координаты вершин отрезков известны. А координаты отрезков нужно тогда вычислять. В итоге не на много короче со скалярным, по-моему.
Алён@ вне форума Ответить с цитированием
Старый 10.03.2009, 20:25   #5
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Скорее всего, у вас ошибка там, где формируются координаты точек, потому что эта функция с явно переданными данными работает правильно (в аттаче). Возможно, что где-то координаты точки, лежащей ниже общей, берутся так, что она получается выше (по результатам похоже).
Вложения
Тип файла: rar Project2.rar (465 байт, 10 просмотров)
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При выполнении программа отображает ошибку, в чем проблема понять не могу Hyjak Помощь студентам 7 20.10.2008 23:48
Не могу понять в чем проблема (код) diznt Помощь студентам 2 03.08.2008 10:20
Помогите понять в чем ошибка (работа со строками) Edimus Общие вопросы C/C++ 1 22.11.2007 14:09
не могу понять... Dutchman Паскаль, Turbo Pascal, PascalABC.NET 4 14.12.2006 07:14