Не подскажет ли многоувожаемы олл
алгоритм (желательно по шагам и с формулами)
вычисления расстояния от точки до отрезка (не до прямой!)
Известно: Отрезок: (x0,y0,z0)-(x1,y1,z1) Точка: (x,y,z)
Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку.
Здравствуйте ZakkeR, Вы писали:
ZR>Не подскажет ли многоувожаемы олл ZR>алгоритм (желательно по шагам и с формулами) ZR>вычисления расстояния от точки до отрезка (не до прямой!) ZR>Известно: ZR> Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR> Точка: (x,y,z)
ZR>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR>
ZR>wbr ZakkeR
Здравствуйте ZakkeR, Вы писали:
ZR>Не подскажет ли многоувожаемы олл ZR>алгоритм (желательно по шагам и с формулами) ZR>вычисления расстояния от точки до отрезка (не до прямой!) ZR>Известно: ZR> :up: Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR> :up: Точка: (x,y,z)
ZR>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR> :))
Концы отрезка пусть будут X и Y, а точка Z.
Тогда L=(X-Y)/|X-Y| будет нормированным (единичной длины) вектором сонаправленным с направлением из Y в X. Осталось найти скалярное произведение (считай проекцию на это направление) с вектором Z-Y. S=(Z-Y,L). Теперь нужную точку можно получить прибавив к координатам Y вектор L*S.
Более подробно. Опустим из Z перпендикуляр на прямую в точку P, задаваемую нашим отрезком. Как найти растояние YP? Для этого можно найти проекцию отрезка YZ на прямую. Для этого можно воспользоваться скалярным произведением: (X,e) = проекции X на e, если e — имеет единичную длину.
Здравствуйте Bell, Вы писали:
B>Здравствуйте ZakkeR, Вы писали:
ZR>>Не подскажет ли многоувожаемы олл ZR>>алгоритм (желательно по шагам и с формулами) ZR>>вычисления расстояния от точки до отрезка (не до прямой!) ZR>>Известно: ZR>> Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR>> Точка: (x,y,z)
ZR>>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR>>
ZR>>wbr ZakkeR
B>Может быть тут?
Здравствуйте ZakkeR, Вы писали:
ZR>Не подскажет ли многоувожаемы олл ZR>алгоритм (желательно по шагам и с формулами) ZR>вычисления расстояния от точки до отрезка (не до прямой!) ZR>Известно: ZR> :up: Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR> :up: Точка: (x,y,z)
ZR>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR> :))
ZR>wbr ZakkeR
Найти три расстояния —
от концов отрезка(r1,r2)
до прямой на которой лежит отрезок(r3).
if(точка в которой перпендикуляр пересекает прямую не пренадлежит отрезку)
rmin=min(r1,r2)
else
rmin=r3
Здравствуйте ZakkeR, Вы писали:
ZR>Не подскажет ли многоувожаемы олл ZR>алгоритм (желательно по шагам и с формулами) ZR>вычисления расстояния от точки до отрезка (не до прямой!) ZR>Известно: ZR> Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR> Точка: (x,y,z)
ZR>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR>
ZR>wbr ZakkeR
Самое простое: *посчитать расстояние до прямой.
*если ближайшая точка прямой находится в отрезке — конец;
*иначе посчитать расстояния до концов отрезка;
*взять минимальное — это и есть результат.
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте Hacker_Delphi, Вы писали:
HD>Здравствуйте ZakkeR, Вы писали:
ZR>>Не подскажет ли многоувожаемы олл ZR>>алгоритм (желательно по шагам и с формулами) ZR>>вычисления расстояния от точки до отрезка (не до прямой!) ZR>>Известно: ZR>> Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR>> Точка: (x,y,z)
ZR>>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR>>
ZR>>wbr ZakkeR HD>Самое простое: HD> HD>*посчитать расстояние до прямой. HD>*если ближайшая точка прямой находится в отрезке — конец; HD>*иначе посчитать расстояния до концов отрезка; HD>*взять минимальное — это и есть результат. HD>
Хех, ясен перец, что это так
Вопрос в том, какие формулы работают на каждом из шагов. Хотя с 3-м и 4-м шагом все просто
Ну да ладно, где-то выше была хорошая ссылка...
Здравствуйте ZakkeR, Вы писали:
ZR>Здравствуйте Hacker_Delphi, Вы писали:
HD>>Здравствуйте ZakkeR, Вы писали:
ZR>>>Не подскажет ли многоувожаемы олл ZR>>>алгоритм (желательно по шагам и с формулами) ZR>>>вычисления расстояния от точки до отрезка (не до прямой!) ZR>>>Известно: ZR>>> Отрезок: (x0,y0,z0)-(x1,y1,z1) ZR>>> Точка: (x,y,z)
ZR>>>Выражаясь математически, мне нужен минимум всех расстояний от заданной точки до всех точек, принадлежащих отрезку. ZR>>>
ZR>>>wbr ZakkeR HD>>Самое простое: HD>> HD>>*посчитать расстояние до прямой. HD>>*если ближайшая точка прямой находится в отрезке — конец; HD>>*иначе посчитать расстояния до концов отрезка; HD>>*взять минимальное — это и есть результат. HD>>
ZR>Хех, ясен перец, что это так ZR>Вопрос в том, какие формулы работают на каждом из шагов. Хотя с 3-м и 4-м шагом все просто ZR>Ну да ладно, где-то выше была хорошая ссылка...
Так есть же стандартные формулы для расчета расстойния от точки до прямой %)
Там все просто:
Дано: (x1, y1) — начало отрезка, (x2, y2) — конец отрезка и (x0, y0) — точка. берем точки известные нам (концы отрезка) из них делаем уравнение вида: y = kX + c1
делаем уравнение перпендикуляра. (точно не помню, однозначно, что y = (+/-)(1/k)X + c2, а вот как +/- надо сесть и поглядеть в геометрии). Перпендикуляр должен проходить через данную нам по задаче точку , что достигается подгонкой константы c2 (там тоже все просто — планиметрия, однако).
по уравнению перпендикуляра и уравнению прямой находим x3 точки пересечения.
проверяем, что етот x3 лежит в диапазоне (x1, x2) если лежит — считаем x3 и имеем координаты ближайшей к (x0, y0) точки отрезка, если не лежит — берем один из концов отрезка — тот, который ближе.
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте Hacker_Delphi, Вы писали:
HD>Дано: (x1, y1) — начало отрезка, (x2, y2) — конец отрезка и (x0, y0) — точка. HD> HD>берем точки известные нам (концы отрезка) из них делаем уравнение вида: y = kX + c1 HD>делаем уравнение перпендикуляра. (точно не помню, однозначно, что y = (+/-)(1/k)X + c2, а вот как +/- надо сесть и поглядеть в геометрии). Перпендикуляр должен проходить через данную нам по задаче точку , что достигается подгонкой константы c2 (там тоже все просто — планиметрия, однако). HD>по уравнению перпендикуляра и уравнению прямой находим x3 точки пересечения. HD>проверяем, что етот x3 лежит в диапазоне (x1, x2) если лежит — считаем x3 и имеем координаты ближайшей к (x0, y0) точки отрезка, если не лежит — берем один из концов отрезка — тот, который ближе. HD>HD>
А если посмотреть в субж, то можно увидеть, что двухмерный случай нам не интересен
Здравствуйте ZakkeR, Вы писали:
ZR>Здравствуйте Hacker_Delphi, Вы писали:
HD>>Дано: (x1, y1) — начало отрезка, (x2, y2) — конец отрезка и (x0, y0) — точка. HD>> HD>>берем точки известные нам (концы отрезка) из них делаем уравнение вида: y = kX + c1 HD>>делаем уравнение перпендикуляра. (точно не помню, однозначно, что y = (+/-)(1/k)X + c2, а вот как +/- надо сесть и поглядеть в геометрии). Перпендикуляр должен проходить через данную нам по задаче точку , что достигается подгонкой константы c2 (там тоже все просто — планиметрия, однако). HD>>по уравнению перпендикуляра и уравнению прямой находим x3 точки пересечения. HD>>проверяем, что етот x3 лежит в диапазоне (x1, x2) если лежит — считаем x3 и имеем координаты ближайшей к (x0, y0) точки отрезка, если не лежит — берем один из концов отрезка — тот, который ближе. HD>>HD>>
ZR>А если посмотреть в субж, то можно увидеть, что двухмерный случай нам не интересен
А адаптировать алгоритм для 3D слабо??? или работать в плоскости, которая образована отрезком и точкой??? :mainc:
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))