Помощь - Поиск - Пользователи - Календарь
Полная версия: Проверка подобия треугольников
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Скрытная
по заданным координатам вершин двух треугольников (xA,yA,xB,yB...) нужно определить являются ли они подобными.

если кто-нибудь делал такое поделитесь мыслями... меня в задаче смущает что стороны в треугольниках получаются не целочисленными... тогда как опеределять их отношение =\
volvo
Цитата
Два треугольника подобны, если выполняется одно из следующих условий, называемых признаками подобия:
1. Два угла одного треугольника равны двум углам другого треугольника.
2. Две стороны одного треугольника пропорциональны двум сторонам другого треугольника, а углы, образованные этими сторонами, равны.
3. Три стороны одного треугольника соответственно пропорциональны трем сторонам другого треугольника.
Так что, нет совершенно никакой необходимости завязываться на сторонах - можно найти углы и сравнить... Примеры нахождения сторон/углов по заданным координатам были на форуме.

Кстати, а в чем проблема с нецелочисленными сторонами? Что, к вещественным числам нельзя применять операцию деления?
Lapp
Цитата(Скрытная @ 23.11.2007 0:42) *
стороны в треугольниках получаются не целочисленными... тогда как опеределять их отношение =\
blink.gif ???
Определить отношение - нетрудно: операцию деления вещественных чисел, как отметил volvo, никто не отменял.. Вот сравнить потом эти отношения между собой - это уже задача. Из-за конечности представления чисел, а также ошибок в задании координат, числа могут отличаться в последних знаках, хотя по идее должны быть равны. Поэтому сравнивать нужно с учетом погрешности. Иначе говоря, нужно писать не так:
if a=b then ...
а так:
if Abs(a-b)<e then ...
- где e - это малое число, зависящее от порядков величин, использующихся в задаче (обычно на 8-10 порядков меньше этих величин, если ты используешь тип real). То есть если у тебя координаты порядка единиц или десятков, то можно взять e равным 10e-8.
volvo
Ну, кстати, сравнивать отношение целых чисел пришлось бы точно так же - деление всегда возвращает вещественный результат, и нельзя пользоваться простым "="...
Lapp
Цитата(volvo @ 23.11.2007 9:20) *
деление всегда возвращает вещественный результат,
- это смотря какое... div - таки нет! smile.gif
volvo
Но согласись, что проверять треугольник со сторонами <11, 12, 17> на подобие треугольнику со сторонами <3, 4, 5> используя DIV - просто верх легкомыслия smile.gif
Lapp
Соглашусь, конечно.
Но не большее, чем 99% поступков остальных новичков тут.. smile.gif
xds
Если координаты - целые числа, то
if (a1 * b2 = a2 * b1) and (b1 * c2 = b2 * c1) and (c1 * a2 = c2 * a1) then
{ подобны }
else
{ не подобны (бесподобны smile.gif)}
где a1, b1, c1, a2, b2, c2 - квадраты длин сторон треугольников, т. е.
a1 := Sqr(x12 - x11) + Sqr(y12 - y11);
a2 := Sqr(x22 - x21) + Sqr(y22 - y21);
b1 := Sqr(x13 - x12) + Sqr(y13 - y12);
b2 := Sqr(x23 - x22) + Sqr(y23 - y22);
c1 := Sqr(x11 - x13) + Sqr(y11 - y13);
c2 := Sqr(x21 - x23) + Sqr(y21 - y23);



Lapp
Заменить пропорцию на произведение вполне разумно. yes2.gif
И, если не извлекать корни, то сравнение можно проводить точным равенством. yes2.gif
Согласен, так красивше. Конечно, если координаты - целые smile.gif. Но, судя по замечаниям автора темы, это скорее всего так и есть. smile.gif
xds
Подобное встречалось мне в какой-то олимпиадной задаче - прочие реализации не проходили некоторые тесты.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.