Изменить:Изменил заголовок. Меня меньше интересует, чтобы два сегмента были одинаковыми, а скорее, если они коллинеарны друг другу, в пределах определенного допуска. Если это так, то линии должны быть сгруппированы вместе как один сегмент.
Изменить:Я думаю, короче говоря, :я пытаюсь сгруппировать похожие сегменты линий вместе эффективным способом.
Скажем, у меня есть отрезкиf
(fx0, fy0)
и (fx1, fy1)
иg
(gx0, gy0)
и(gx1, gy1)
Они исходят от чего-то вроде детектора границ алгоритма компьютерного зрения -, и в некоторых случаях две линии в основном одинаковы,но считаются двумя отдельными линиями из-за допусков пикселей.
Есть несколько сценариев
f
и g
имеют одни и те же конечные точки, например:f = (0,0), (10,10) g = (0,0), (10,10)
f
и g
имеют примерно одинаковые конечные точки и примерно одинаковую длину, например:f = (0,0.01), (9.95,10) g = (0,0), (10,10)
f
является подмножеством g
, что означает, что его конечные точки попадают в сегмент g
и имеют тот же наклон, что и сегмент g
. Подумайте о грубо нарисованной линии, по которой перо двигалось вперед и назад, чтобы сделать ее толще. например:f = (4.00, 4.02), (9.01, 9.02) g = (0,0), (10,10)
Следующее будет не считаться одним и тем же:
f
и g
имеют разность наклонов за пределами определенногоtolerance
f
и g
могут иметь одинаковый наклон, но разделены расстоянием за пределами tolerance
, т. е. параллельными линиямиf
и g
находятся в одной плоскости и на одном склоне, но совершенно не пересекаются... т.е. набор сегментов внутри пунктирной линии.Самый простой способ узнать, одинаковы ли они, это еслиgx1 - fx1 <= tolerance
(повторить для трех других точек ), но в некоторых случаях линия f
может быть короче линииg
(опять же, из-за различий в пикселях и/или плохого сканирования фотографий ).
Так что лучше преобразовать два сегмента в полярные координаты и сравнить углы? В этом случае два ро будут в пределах допуска. Но тогда вы должны убедиться, что два сегмента линии имеют одно и то же «направление», которое тривиально вычислить в декартовых или полярных координатах.
Так что это легко понять, но мне просто интересно, есть ли более чистый способ, основанный на линейной алгебре, которую я давно забыл?