В нашей системе есть требования, по которым мы хотим переместить некоторые исходные строки (с низкой точностью) в опорные линии (с высокой точностью). Следующие картинки дают нормальные варианты использования. Красный - это исходная линия, а синий - контрольная.
В этом случае исходная строка будет частично перемещена, и результат будет таким, как показывает зеленая линия:
Есть ситуации, когда исходная строка должна быть полностью перемещена.
Результат:
В настоящее время наше решение является руководитель проекта / конечную точку исходной линии к опорной линии, и наоборот, а затем найти проецируемые точки на линии источника и ссылки. С учетом этих прогнозируемых точек, мы можем извлечь необходимую часть исходной строки и эталонным, а затем объединить их в новую.
Это работает в большинстве случаев, но есть случаи, когда этот метод не работает. В частности, когда любая из линий имеет форму, подобную букве «С», или точка начала очень близка к конечной точке. Следующие две картинки дают сценарий.
Применяя мой алгоритм, мы получаем результат:
В некотором смысле это понятно, потому что текущий алгоритм просто находит спроецированные точки и извлекает линии.
Мы ожидали что-то вроде этого:
Так что мне нужен более надежный алгоритм, чтобы сделать это, чтобы он мог также обрабатывать особые случаи, как в предыдущем. Я пытался проецировать каждую точку от линии к другой и находить две проецируемые точки, которые ближе всего к точке начала / конца проецируемой линии, но не было удачи. Тем не менее я могу найти случаи, которые дают неожиданные результаты.
Кто-нибудь сталкивался с подобными проблемами раньше? Было бы также хорошо, если бы программное обеспечение или библиотека могли выполнять аналогичную работу. Любой ответ будет оценен.
Ответы:
Моя оценка состоит в том, что конечные случаи часто являются исключениями, которые не программируются машиной. Я работал с похожими проблемами, и они всегда требовали определенного ручного редактирования. То, что вам нужно настроить, - это исключения, которые вырабатываются делом и передают их в систему управления работой конечному пользователю.
источник
Для этого алгоритма вам понадобится допуск на привязку и поворот (я предполагаю, что у вас уже есть допуск на привязку).
Спроецируйте верхнюю точку от исходной линии до контрольной линии. Разбейте контрольную линию в этой спроецированной точке.
Пройдите линию источника от головной точки до первой вершины, чтобы получить направление движения вдоль линии источника. Пройдите каждую из двух опорных линий от проектируемой исходной точки до следующей вершины. Если направление движения находится в пределах допустимого отклонения от направления движения от головной точки на исходной линии, примените свой алгоритм в обычном режиме, но только с использованием этого участка контрольной линии. Если алгоритм достигает конца строки источника, все готово. Если нет, разорвите линию источника между преобразованной частью и нетрансформированной частью (которая будет включать конечную точку).
Теперь возьмите нетрансформированный фрагмент и спроецируйте конечную точку на исходную контрольную линию. Проделайте ту же процедуру, что и раньше ... Пройдите источник от конечной точки до первой вершины, чтобы найти направление движения. Разбейте контрольную линию в конечной точке проекта и проследите каждую из них, чтобы определить, находится ли направление движения от проектируемой конечной точки в пределах допустимого поворота. Если это так, используйте эту часть контрольной линии, чтобы применить алгоритм нормально.
Помните, что в данный момент вы используете только нетрансформированную фигуру, поэтому вы не будете пересекаться с трансформацией заголовка.
Наконец, при необходимости объедините две результирующие отрезки линии: преобразованную точку головной точки из спроецированной верхней точки в нетрансформированную точку разрыва, а затем в конечную точку, преобразованную деталь из непревращенной точки разрыва в прогнозируемую конечную точку.
источник