Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проверка подобия треугольников

Автор: Скрытная 23.11.2007 4:42

по заданным координатам вершин двух треугольников (xA,yA,xB,yB...) нужно определить являются ли они подобными.

если кто-нибудь делал такое поделитесь мыслями... меня в задаче смущает что стороны в треугольниках получаются не целочисленными... тогда как опеределять их отношение =\

Автор: volvo 23.11.2007 4:57

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

Кстати, а в чем проблема с нецелочисленными сторонами? Что, к вещественным числам нельзя применять операцию деления?

Автор: Lapp 23.11.2007 11:04

Цитата(Скрытная @ 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 23.11.2007 13:20

Ну, кстати, сравнивать отношение целых чисел пришлось бы точно так же - деление всегда возвращает вещественный результат, и нельзя пользоваться простым "="...

Автор: Lapp 23.11.2007 15:38

Цитата(volvo @ 23.11.2007 9:20) *
деление всегда возвращает вещественный результат,
- это смотря какое... div - таки нет! smile.gif

Автор: volvo 23.11.2007 15:44

Но согласись, что проверять треугольник со сторонами <11, 12, 17> на подобие треугольнику со сторонами <3, 4, 5> используя DIV - просто верх легкомыслия smile.gif

Автор: Lapp 23.11.2007 15:57

Соглашусь, конечно.
Но не большее, чем 99% поступков остальных новичков тут.. smile.gif

Автор: xds 23.11.2007 17:44

Если координаты - целые числа, то

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 23.11.2007 18:03

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

Автор: xds 23.11.2007 19:07

Подобное встречалось мне в какой-то олимпиадной задаче - прочие реализации не проходили некоторые тесты.