![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
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 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Какая разница между чем? у нас всена плоскости происхдит.
Клем - нарисуй 2 треугольника и посмотри кратчайшее растояние между сторонами... такое растояние всегда будет проходить через вершины треугольника.... так что важны нам только координаты вершин. палочка выручалочка дял нас фраза: Цитата В плоскости, даны -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Цитата такое растояние всегда будет проходить через вершины треугольника.... :no: неправда. может быть случай, когда кратчайшее расстояние : у одного треугольника - вершина, а у другого нет. Сообщение отредактировано: klem4 - -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
klem4, опровержение - в студию...
![]() Oleg_Z имел в виду, что кратчайшее расстояние обязательно пройдет через вершину одного из треугольников... |
Altair |
![]()
Сообщение
#6
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
klem4, если ты не прав, ты покупаешь мне 2 пива!
Сообщение отредактировано: Oleg_Z - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#7
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Volvo, написано
Цитата через вершины Но я как раз имел в виду вариант, который высказал ты : зы : Олег, с тебя пиво ?) Сообщение отредактировано: klem4 - Эскизы прикрепленных изображений ![]() -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Altair |
![]()
Сообщение
#8
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата через вершины Цитата ....треугольника! все равно я прав! :P пиво ты покупаешь! Сообщение отредактировано: Oleg_Z - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
killer on the road |
![]()
Сообщение
#9
|
Гость ![]() |
Господа, всё это конечно интересно, но может кто нить по сути выразится
![]() А вы не подумали, что если треугольники пересекаются, то кратчайшее растояние в точке пересечения, а она может находится далеко не в вершинах.... |
Altair |
![]()
Сообщение
#10
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Алгоритм. (если треугольники не пересекаются)
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 - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Altair |
![]()
Сообщение
#11
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата что если треугольники пересекаются, то кратчайшее растояние в точке пересечения, а она может находится далеко не в вершинах.... Можно перебрать для начала сторны и проверить на предмет пересечения. А потом к сторонам непересекающимся применить алгоритм вышеуказанный. p.s. но если стороны пересекаются то смысла в расстоянии между пересекающимися сторонами нет! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
killer on the road |
![]()
Сообщение
#12
|
Гость ![]() |
Цитата p.s. но если стороны пересекаются то смысла в расстоянии между пересекающимися сторонами нет! Смысла-то, оно конечно нет. Просто, по условию задачи, координаты вершин рэндомны. Так что, пересечений не избежать. За алгоритм спасибо, попробую реализовать. Только вот я недопонял как это перебрать стороны на предмет пересечения? Если тупым перебором всех точек, то ни проще ли сразу вычислять кратчайшее растояние? |
Altair |
![]()
Сообщение
#13
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата как это перебрать стороны на предмет пересечения? Как проверить пересекаются ли 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-ем случае делаешь так:
{
грань - (x1,x2) и (x3,y3)
вершина -(x2,y2)
}
a:=arctan((y3-y1)/(x3-x1));
xx:=(x2-x1)*cos(a)+(y2-y1)*sin(a)+x1;
yy:=y1;
if (xx<x1) or (xx>x3) then
{ перпендикуляр не на отрезке -> возьмешь
минимум из вариантов 1 или 2}
else begin
x4:=(xx-x1)*cos(-a)+(yy-y1)*sin(-a)+x1;
y4:=(yy-y1)*cos(-a)-(xx-x1)*sin(-a)+y1;
в 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 варианта вершина-вершина и вершина-грань. Рисуются оба варианта, минимум из них выберешь. На пересечения граней не делал, это вроде просто добавить ![]()
uses crt,graph;
type pt=record
x:extended;
y:extended;
end;
var t: array [0..1,1..3] of pt;
i1,j1,i2,i3:byte;
ii,i,j,n,nn,n1:integer;
a,xx2,xx,yy,x4,y4,x4_, y4_, rm,r, rg:extended;
begin
randomize;
i:=detect; initgraph(i,i,'');
repeat
cleardevice;
for n:=0 to 1 do for i:=1 to 3 do begin
t[n][i].x:=random(640); t[n][i].y:=random(480);
end;
i1:=0; j1:=0; rm:=0; rg:=0;
for n:=0 to 1 do begin
for i:=1 to 3 do for j:=1 to 3 do begin
nn:=n xor 1;
r:=sqrt(sqr(t[n][i].x-t[nn][j].x)+sqr(t[n][i].y-t[nn][j].y));
if (r<rm) or (rm=0) and (n=0) then begin rm:=r; i1:=i; j1:=j; end;
if t[nn][(j mod 3)+1].x=t[nn][j].x then a:=0 else
a:=arctan((t[nn][(j mod 3)+1].y-t[nn][j].y)/ (t[nn][(j mod 3)+1].x-t[nn][j].x));
xx:=(t[n][i].x-t[nn][j].x)*cos(a)+
(t[n][i].y-t[nn][j].y)*sin(a)+t[nn][j].x;
yy:=t[nn][j].y;
xx2:=(t[nn][(j mod 3)+1].x-t[nn][j].x)*cos(a)+
(t[nn][(j mod 3)+1].y-t[nn][j].y)*sin(a)+t[nn][j].x;
if ((t[nn][j].x<xx2) and ((xx<t[nn][j].x) or (xx>xx2))) or
((t[nn][j].x>xx2) and ((xx>t[nn][j].x) or (xx<xx2))) then
begin x4:=999; y4:=999; end else begin
x4:=(xx-t[nn][j].x)*cos(-a)+(yy-t[nn][j].y)*sin(-a)+t[nn][j].x;
y4:=(yy-t[nn][j].y)*cos(-a)-(xx-t[nn][j].x)*sin(-a)+t[nn][j].y;
end;
r:=sqrt(sqr(t[n][i].x-x4)+sqr(t[n][i].y-y4));
if (r<rg) or (rg=0) then begin
n1:=n; x4_:=x4; y4_:=y4; rg:=r; i3:=i;
end; end; end;
setcolor(7);
for n:=0 to 1 do for i:=1 to 3 do
line(round(t[n][i].x),round(t[n][i].y),
round(t[n][(i mod 3)+1].x),round(t[n][(i mod 3)+1].y));
setcolor(4);
line(round(t[0][i1].x),round(t[0][i1].y), round(t[1][j1].x),round(t[1][j1].y));
setcolor(5);
line(round(t[n1][i3].x),round(t[n1][i3].y), round(x4_),round(y4_));
until readkey=' ';
end.
|
![]() ![]() |
![]() |
Текстовая версия | 18.04.2025 13:31 |