Работа с неточным чертежом в чертеже САПР - PullRequest
1 голос
/ 12 января 2011

У меня есть приложение CAD, которое позволяет пользователю рисовать линии и многоугольники и все такое.

Одна сложная проблема, с которой я сталкиваюсь, заключается в том, что рисование пользователя может быть очень неточным, например, пользователь может захотеть нарисовать два прямоугольника, которые связаны друг с другом. Следовательно, должна быть одна линия, разделенная двумя прямоугольниками. Однако пользователю легко вместо рисования линии нарисовать две линии, которые расположены очень близко друг к другу, настолько близко друг к другу, что, глядя на экран, вы ошибаетесь, что они та же строка, за исключением того, что это не так, когда вы немного увеличиваете.

Моему приложению потребуется, чтобы пользователь правильно рисовал линии (или моя предварительная обработка должна иметь возможность выполнять автокоррекцию), иначе мой внутренний алгоритм (назовем его Алгоритм ) не сможет обработать входы правильно.

Какова лучшая стратегия борьбы с такого рода проблемами? Я думаю о округлении координат точек с определенной степенью точности, но хотя я не могу точно определить проблему этого подхода, но я чувствую , что это не правильный способ делать вещи, что это создаст новые проблемы.

Редактировать: ради аргумента привязка недоступна. Между прочим, все виды «входной стороны» не доступны. Исправление должно быть сделано с помощью предварительной обработки моего кода, когда рисование закончено, но перед тем, как я отправлю его в свой алгоритм.

Безумное ограничение, говорите вы. Но пользователь может создать свои входные данные либо в моем приложении, либо они могут создать свои входные данные в другом программном обеспечении САПР, а затем отправить его в мой движок для выполнения расчетов. Я не могу контролировать, как они вводят в другое программное обеспечение САПР.

Редактировать 2: я могу позволить пользователю указать «радиус кластера», но важный момент заключается в том, что мне нужно убедиться, что мой алгоритм предварительной обработки непротиворечив и не будет действительно вводить новый набор проблемы.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Мне кажется, что ваша основная проблема (надеюсь, я правильно понял) определить, являются ли две строки "одной и той же".

Исходя из моего собственного опыта, вы чувствуете, что правильно, округление координат на входе может оказаться не очень хорошей идеей.

Возможно, вам следует оставить координаты во входных данных такими, какие они есть, но реализовать вашу функцию, назовем ее IsSameLine, которую вы используете в " Алгоритм " (который среди других определяет, связаны ли два прямоугольника, если я понял ваше описание правильно).

IsSameLine может преобразовывать конечные точки входных линий из исходных координат в координаты экрана с учетом определенного (возможно настраиваемого) разрешения экрана и проверять, совпадают ли они в координатах экрана.

т.е. допустим, у вас есть входной файл со следующим экстентом (lowerleft) (upperRight) ((10,10), (24,53)). Вопрос заключается в том, насколько далеко друг от друга будут точки (11,15) и (11.1, 15.1), если они нарисованы на уровне «масштабирования до экстентов» на экране 1600x1200 пикселей. Таким образом, вы можете определить преобразование из исходных координат в «экранные координаты». Затем вы используете это преобразование в IsSameLine, как описано выше.

Я не уверен, однако, это будет на самом деле хорошим решением для вас.

Другая (возможно, лучшая?) Возможность - реализовать IsSameLine, возвращающую true, если точки двух линий находятся на максимальном расстоянии в эпсилоне друг от друга. Эпсилон может иметь значение по умолчанию, вычисленное на основе экстента входных векторных данных, и, вероятно, было бы неплохо дать пользователю возможность задать для него другое значение.

2 голосов
/ 12 января 2011

Одна проблема, которую я вижу, состоит в том, что ваш алгоритм кластеризации / привязки должен был бы самостоятельно решить, какую точку перемещать в какую другую точку.вторая точка привязана к первой.Если в автономном режиме вы получаете кучу точек, которые, как вы знаете, должны быть привязаны друг к другу, вы не знаете, где должна находиться полученная точка.Рассчитать среднее значение, возможно, приведет к совершенно новой точке?Выберите самый центральный пункт из всех кандидатов?Выберите один наугад?Попробуйте выровнять свою точку с некоторыми другими точками на оси x / y / z?

Если ваша программа вообще допускает любое взаимодействие с пользователем, вы можете обнаружить точечные кластеры, которые могут быть кандидатами.для слияния и предоставления пользователю различных целевых точек слияния на выбор.
В противном случае вы могли бы сделать этот тип поведения настраиваемым: взять радиус слияния (", если две или более точек находятся в пределах n единиц друг от друга ... ") и алгоритм слияния (" ... объединить их в самые центральные из указанных точек ") в качестве параметров и считать их из файла конфигурации.

2 голосов
/ 12 января 2011

Точки привязки. Пользователь должен иметь возможность привязки к конечным точкам (и многим другим), а затем, когда вы обнаружите привязку, просто измените точку, по которой щелкнул пользователь, на точку привязки. Проверьте AutoCAD, функции End End, Middle и т. Д.

РЕДАКТИРОВАТЬ: Если вы хотите снимать в автономном режиме, вам просто нужно проверить каждую пару точек, если они находятся рядом друг с другом. Проблема в том, что это в NP-проблеме, так что это займет много времени, так как вы не можете получить в O (n ^ 2) сложность времени. Этот алгоритм, который вам нужен, должен находиться под «кластеризацией».

РЕДАКТИРОВАТЬ2: Я думаю, вы не должны считать, что входные данные плохие. Но если вы действительно хотите это сделать, проще всего взять каждую точку, проверить, есть ли другие точки в радиусе, определяемом пользователем, если да, найдите целую группу, которая должна объединиться в одну точку, найдите средние координаты точек и укажите все их к этой конкретной точке. Но помните - большинство дизайнеров ЗНАЮТ, для чего нужны точки привязки, и если они их не используют, у них есть правильное представление об этом.

...