Ваш вопрос довольно широк, и поэтому мое объяснение стало несколько длинным.Я предложу два варианта алгоритма взрыва как для осевой, так и для радиальной обработки.
Чтобы проиллюстрировать их на примере, я буду использовать следующие числа (ограничивающие рамки только по оси, только пять частей):
P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)
Хотя детали от P1
до P4
точно соприкасаются друг с другом, P4
и P5
фактически перекрываются.
Первый - это алгоритм, который в основном масштабирует расстояния нафактор, такой как вы предложили.Будет страдать, если размер деталей сильно отличается в сборке, но также и для перекрывающихся деталей (например, в вашем примере вдоль оси расширение круга зубчатого колеса намного меньше держателя бита).
Пусть коэффициент масштабирования будетf
, тогда центр каждой ограничительной рамки масштабируется на f
, а расширение - нет.Части тогда были бы
P1: 5 + [-5,5] => P1': 5*f + [-5,5]
P2: 12 + [-2,2] => P2': 12*f + [-2,2]
P3: 15 + [-1,1] => P3': 15*f + [-1,1]
P4: 20 + [-4,4] => P4': 20*f + [-4,4]
P5: 22 + [-4,4] => P5': 22*f + [-4,4]
Расстояние между частями P1'
до P4
тогда дается как
P2' - P1' : (12*f-2) - (5*f+5) = 7*(f-1)
P3' - P2' : (15*f-1) - (12*f+2) = 3*(f-1)
P4' - P3' : (20*f-4) - (15*f+1) = 5*(f-5)
Как и ожидалось, разница равна нулю для f=0
, но дляВ любом разобранном виде расстояние сильно зависит от размеров отдельных частей.Я не думаю, что это будет выглядеть слишком хорошо, если вариация размеров больше.
Кроме того, для перекрывающихся деталей
P5' - P4' : (22*f-4) - (20*f+4) = 2*f-8
они все равно перекрываются для разумного f.
Другой возможностью было бы определить не масштабный коэффициент для оси, а постоянное расстояние детали d
.Тогда ограничивающие рамки будут выровнены следующим образом:
P1': [ 0,10]
P2': [10,14]+d
P3': [14,16]+2*d
P4': [16,24]+3*d
P5': [18,26]+4*d+6
Обратите внимание, что в последней строке мы добавили 24-8=6
, то есть перекрытие, чтобы различать две части.
Хотя этот алгоритм обрабатывает вышеупомянутые случаи в (на мой взгляд) лучше, мы должны добавить особую осторожность к частям, которые охватывают несколько других частей и не должны быть включены в группировку (например, ручка сверху в вашемдело).
Одной из возможностей было бы сгруппировать детали в группы на первом этапе, а затем применить алгоритм к ограничивающей рамке этих групп.После этого его можно снова применить к деталям в каждой группе, исключив части, которые охватывают более одной подгруппы.В вашем случае это было бы (обратите внимание, что возможна вложенная группировка):
[
([battery,(switch,circuit switch),motor],handle top),
motor cog,
tri-cog,
red-cog,
circle-cog,
bit-holder,
(gear casing,spring,lock knob)
]
Вы можете заметить, что я ввел два разных типа групп: части / группы в квадратных скобках обрабатываются алгоритмом, т.е.Интервал добавляется между каждой частью / подгруппой внутри такой группы, в то время как группы внутри круглых скобок не разбиваются.
До сих пор мы не обрабатывали радиальный взрыв, потому что он прекрасно отделяет обработку оси.Но опять же, оба подхода могут быть использованы и для радиального взрыва.Но опять же, на мой взгляд, второй алгоритм дает более приятные результаты.Например, для радиальной обработки группы могут быть выполнены следующим образом:
[
(battery,switch,<many parts>,gear casing),
(switch,spring),
(handle top, lock knob)
]
В этом случае мы добавим дополнительный компонент r
ко всем радиальным центрам во второй группе и 2*r
ко всем в третьейgroup.
Обратите внимание, что простой алгоритм масштабирования работает без специального руководства пользователя (если указан коэффициент масштабирования), а второй использует дополнительную информацию (группирование).
Надеюсь, это довольно долгообъяснение дает вам некоторые идеи, как действовать дальше.Если мои объяснения неясны в какой-то момент или у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь комментировать.