- Сортировка всех ваших сегментов по углу (в диапазоне от 0 до Pi) и построение отсортированной карты угла к сегменту.
- Определите некоторый порог разности углов, ниже которого два сегмента могутсчитаться параллельным.Выполните итерацию по вашей карте и для каждого сопоставления рассмотрите смежные сопоставления по обе стороны от угла (необходимо выполнить обтекание), которые считаются параллельными.
- В каждом наборе почти параллельных сегментов посмотрите, являются ли они "продолжениями"друг от друга.
Два отрезка (A, B) и (C, D) приблизительно коллинеарны, если все возможные пары из 4 точек примерно параллельны.Вы можете использовать тот же тест, что и выше.
Псевдокод:
Angle(A,B)
return Atan((B.y-A.y) / (B.x-A.x)) // use atan2 if possible, but needs wrapping
NearlyParallel(angle1, angle2)
delta = Abs(angle1-angle2)
return (delta < threshold) or (delta > Pi-threshold)
Collinear(A,B, C,D)
// Assume NearlyParallel(Angle(A,B), Angle(C,D)) == true
return NearlyParallel(Angle(A,C), Angle(B,D)) and NearlyParallel(Angle(A,D), Angle(B,C))