![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
killer on the road |
![]()
Сообщение
#1
|
Гость ![]() |
В плоскости, даны два треугольника. Требуется определить кратчайшее растояние между их сторонами.
Пока у меня есть только идея тупого перебора. Находим формулы описывающие каждую сторону, проходим циклом по всем Х, попутно генерируя У, и сравниваем с таким же циклом для второго треугольника. Получается очень много сравнений. Может есть какая нибудь хитрая идея? |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
а точно надо определить кратчайшее расстояние между сторонами а не вершинами ?
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Altair |
![]()
Сообщение
#3
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Какая разница между чем? у нас всена плоскости происхдит.
Клем - нарисуй 2 треугольника и посмотри кратчайшее растояние между сторонами... такое растояние всегда будет проходить через вершины треугольника.... так что важны нам только координаты вершин. палочка выручалочка дял нас фраза: Цитата В плоскости, даны -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Цитата такое растояние всегда будет проходить через вершины треугольника.... :no: неправда. может быть случай, когда кратчайшее расстояние : у одного треугольника - вершина, а у другого нет. Сообщение отредактировано: klem4 - 26.06.2005 18:41 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
klem4, опровержение - в студию...
![]() Oleg_Z имел в виду, что кратчайшее расстояние обязательно пройдет через вершину одного из треугольников... |
Altair |
![]()
Сообщение
#6
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
klem4, если ты не прав, ты покупаешь мне 2 пива!
Сообщение отредактировано: Oleg_Z - 26.06.2005 18:50 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#7
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Volvo, написано
Цитата через вершины Но я как раз имел в виду вариант, который высказал ты : зы : Олег, с тебя пиво ?) Сообщение отредактировано: klem4 - 26.06.2005 18:48 Эскизы прикрепленных изображений ![]() -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Altair |
![]()
Сообщение
#8
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата через вершины Цитата ....треугольника! все равно я прав! :P пиво ты покупаешь! Сообщение отредактировано: Oleg_Z - 26.06.2005 18:50 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
killer on the road |
![]()
Сообщение
#9
|
Гость ![]() |
Господа, всё это конечно интересно, но может кто нить по сути выразится
![]() А вы не подумали, что если треугольники пересекаются, то кратчайшее растояние в точке пересечения, а она может находится далеко не в вершинах.... |
Altair |
![]()
Сообщение
#10
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Алгоритм. (если треугольники не пересекаются)
i=1 1. берем i точку и находим координаты точек пересечения высот проведенных от i точки до каждой из сторон другого треугольника. (*) Выбираем минимум из 3 длин. 2. i=i+1, перейти на 1. Как найти точку пересечения высоты проведенной из точки i-M(x0,y0) до стороны l ? Для этого надо найти коэффициенты уравнения стороны l (A, B,C) L: Ax+By+C и найти координаты точки пересечения p по формуле: x= x0+at где параметр t = - (Ax0+By0+C)/(A^2 +B^2); Как найти уравнение стороны, зная координаты 2 точек? пусть дана точка M1(x1,y1) и точка M2(x2,y2), принадлежащие L, тогда : L: (x-x1)/(x2-x1) = (y-y1)/(y2-y1) P.S. здесь (*) надопроверить лежат ли точки пересечения на сторне иди выходят за пределы отрезка. Сообщение отредактировано: Oleg_Z - 26.06.2005 19:14 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Altair |
![]()
Сообщение
#11
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата что если треугольники пересекаются, то кратчайшее растояние в точке пересечения, а она может находится далеко не в вершинах.... Можно перебрать для начала сторны и проверить на предмет пересечения. А потом к сторонам непересекающимся применить алгоритм вышеуказанный. p.s. но если стороны пересекаются то смысла в расстоянии между пересекающимися сторонами нет! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
killer on the road |
![]()
Сообщение
#12
|
Гость ![]() |
Цитата p.s. но если стороны пересекаются то смысла в расстоянии между пересекающимися сторонами нет! Смысла-то, оно конечно нет. Просто, по условию задачи, координаты вершин рэндомны. Так что, пересечений не избежать. За алгоритм спасибо, попробую реализовать. Только вот я недопонял как это перебрать стороны на предмет пересечения? Если тупым перебором всех точек, то ни проще ли сразу вычислять кратчайшее растояние? |
Altair |
![]()
Сообщение
#13
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата как это перебрать стороны на предмет пересечения? Как проверить пересекаются ли 2 отрезка? пересечение отрезков Пересечение: Прямая(отрезок) и прямая (отрезок) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
killer on the road |
![]()
Сообщение
#14
|
Гость ![]() |
Люди, ай нид хелп!
Пытался сделать по материалам этой ссылки - http://ixbt.wallst.ru/egm.html Но что-то незаладилось... Кто нибудь помогите плиз! А ещё оказалось, что кратчайшее растояние может находится между двумя вершинами, но этот случай я уже перебором обработал. А вот вершина-перпендикуляр - не выходит... |
Malice |
![]()
Сообщение
#15
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(killer on the road @ 28.06.05 1:16) Люди, ай нид хелп! Короче, так. У тебя 3 вариана самого короткого расстояния: 1. пересечение граней - уже обсуждалось, сделаешь 2. вершина - вершина - рассояние между всеми проверишь 3. вершина - грань - надо найти перпендикуляр на грань В 3-ем случае делаешь так:
в x4 и y4 точка пересечения. ну и (x2,y2)-(x4,y4) - мин. расстояние. :yes: |
killer on the road |
![]()
Сообщение
#16
|
Гость ![]() |
очень извиняюсь за тупость, а можно полный текст программы... всё вместе никак соеденить не могу. Ну не программер я, не программер.
|
Malice |
![]()
Сообщение
#17
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(killer on the road @ 28.06.05 19:48) очень извиняюсь за тупость, а можно полный текст программы... всё вместе никак соеденить не могу. Ну не программер я, не программер. Ну лови, 2 варианта вершина-вершина и вершина-грань. Рисуются оба варианта, минимум из них выберешь. На пересечения граней не делал, это вроде просто добавить ![]()
|
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 16:09 |