Простой алгоритм Python, необходимый для поиска ограничительной коробки сетки из файла OBJ

StackOverflow https://stackoverflow.com//questions/11660051

  •  11-12-2019
  •  | 
  •  

Вопрос

Я пробую проблему упаковки с помощью файлов Python и OBJ. Я новичок в Python, и не уверен, как манипулировать вершинами файла OBJ, чтобы найти оптимальную ограниченную коробку. Любой образец кода Python, чтобы заставить меня начаться? Вот простой файл box obj, который начнет начать с чего мне нужно вписаться в больший контейнер. Короче говоря, может объектировать x вписываться в объект Y. Затем в конечном итоге, сколько X может вписаться в Y с наиболее оптимальным решением, но это в течение позже.

Вот файлы .obj для маленьких и больших ящиков Маленький:

# Rhino
.

v -5 -5 0 V -5 -5 5 V 0 -5 0 V 0 -5 5 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 F 4/4/4 2/2/2 1/1/1 3/3/3 V 0 -5 0 V 0 -5 5 V 0 0 0 V 0 0 5 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 1 0 0 VN 1 0 0 VN 1 0 0 VN 1 0 0 F 8/8/8 6/6/6 5/5/5 7/7/7 v 0 0 0 v 0 0 5 V -5 0 0 V -5 0 5 VT 0 0. VT 0 1. VT 1 0. VT 1 1. vn 0 1 0 VN 0 1 0 VN 0 1 0 VN 0 1 0 F 12/12/12 10/10/10 9/9/9 11/11/11 V -5 0 0 V -5 0 5 V -5 -5 0 V -5 -5 5 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN -1 0 0 VN -1 0 0 VN -1 0 0 VN -1 0 0 F 16/16/16 14/14/14 13/13/13 15/15/15 V -5 -5 0 V 0 -5 0 V -5 0 0 v 0 0 0 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 0 0 -1 VN 0 0 -1 VN 0 0 -1 VN 0 0 -1 F 20/20/20 18/18/18 17.17.17 19/19/19 V -5 -5 5 V -5 0 5 V 0 -5 5 V 0 0 5 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 0 0 1 VN 0 0 1 VN 0 0 1 VN 0 0 1 F 24/24/24 22/22/22 21/21/21 23/23/23

Большая коробка:

# Rhino
.

v 0 0 0 V 0 0 20 v 0 20 0 V 0 20 20 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN -1 -0 -0 VN -1 -0 -0 VN -1 -0 -0 VN -1 -0 -0 F 4/4/4 3/3/3 1/1/1 2/2/2 v 0 20 0 V 0 20 20 V 20 20 0 V 20 20 20 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 0 1 0 VN 0 1 0 VN 0 1 0 VN 0 1 0 F 8/8/8 7/7/7 5/5/5 6/6/6 v 20 20 0 V 20 20 20 v 20 0 0 v 20 0 20 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 1 0 0 VN 1 0 0 VN 1 0 0 VN 1 0 0 F 12/12/12 11/11/11 9/9/9 10/10/10 v 20 0 0 v 20 0 20 v 0 0 0 v 0 0 20 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 F 16/16/16 15.11.15 13.11.13 14.14.14 v 0 0 0 v 0 20 0 v 20 0 0 v 20 20 0 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN -0 -0 -1 VN -0 -0 -1 VN -0 -0 -1 VN -0 -0 -1 F 20/20/20 19/19/19 17.12.11 18.10.18 V 0 0 20 V 20 0 20 V 0 20 20 V 20 20 20 VT 0 0. VT 0 1. VT 1 0. VT 1 1. VN 0 0 1 VN 0 0 1 VN 0 0 1 VN 0 0 1 F 24/24/24 23/23/23 21/21/21 22/22/22

enter code here
.

Это было полезно?

Решение

Первый, чтобы ответить на вопрос в вашем заголовке:

    .
  • Загрузите каждый файл объекта в виде списка вершин, я предполагаю, что вы уже HSve какой-то код для загрузки файлов .obj в Python (если нет, вы можете настроить это loodobj () Функция, например, заставить его вернуть переменную вершин)
  • для каждого объекта, вычислить ограничивающую коробку, например.:
    def verts_to_bbox(verts):
        xs = [v[0] for v in verts]
        ys = [v[1] for v in verts]
        zs = [v[2] for v in verts]
        return (min(xs), max(xs), min(ys), max(ys), min(zs), max(zs))
    
    .

    Теперь, чтобы тестировать, если один объект «подходит» в другом.По сути, вы хотите знать, является ли одна ограничительная коробка равна или меньше другого во всех размерах, как я понимаю вас. Итак,

      .
    • вычисляет для каждой ограничительной коробки его размер в измерении x, y и z, e.g.:
      def bbox_size(bbox):
          # return tuple with sizes (dx, dy, dz)
          return (bbox[1] - bbox[0], bbox[3] - bbox[2], bbox[5] - bbox[4])
      
      def fits_bbox(bigbox, smallbox):
          bdx, bdy, bdz = bbox_size(bigbox)
          sdx, sdy, sdz = bbox_size(smallbox)
          # return True if small box fits in bigbox in all three dimensions
          return (sdx<bdx and sdy<bdy and sdz<bdz)
      
      .

      Удачи!

Другие советы

Вы захотите повторить данные OBJ, ищущих «V» и проверяют, если следующие координаты X Y и Z и запись самых высоких и наименьших цен, когда вы столкнулись с ним.Следующий код распечатает самое высокое и самое низкое значение для каждого измерения, а затем дает вам ограничительную коробку из этого

obj = 'v -5 -5 0 v -5 -5 5 v 0 -5 0 v 0 -5 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 -1 0 vn 0 -1 0 vn 0 -1 0 vn 0 -1 0 f 4/4/4 2/2/2 1/1/1 3/3/3 v 0 -5 0 v 0 -5 5 v 0 0 0 v 0 0 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 1 0 0 vn 1 0 0 vn 1 0 0 vn 1 0 0 f 8/8/8 6/6/6 5/5/5 7/7/7 v 0 0 0 v 0 0 5 v -5 0 0 v -5 0 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 1 0 vn 0 1 0 vn 0 1 0 vn 0 1 0 f 12/12/12 10/10/10 9/9/9 11/11/11 v -5 0 0 v -5 0 5 v -5 -5 0 v -5 -5 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn -1 0 0 vn -1 0 0 vn -1 0 0 vn -1 0 0 f 16/16/16 14/14/14 13/13/13 15/15/15 v -5 -5 0 v 0 -5 0 v -5 0 0 v 0 0 0 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 0 -1 vn 0 0 -1 vn 0 0 -1 vn 0 0 -1 f 20/20/20 18/18/18 17/17/17 19/19/19 v -5 -5 5 v -5 0 5 v 0 -5 5 v 0 0 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 0 1 vn 0 0 1 vn 0 0 1 vn 0 0 1 f 24/24/24 22/22/22 21/21/21 23/23/23'

elements = obj.split(' ')

x_min = 0.0
x_max = 0.0
y_min = 0.0
y_max = 0.0
z_min = 0.0
z_max = 0.0

i = 0

while i < len(elements):
    if elements[i] == 'v':
        #find min and max x value
        if float(elements[i + 1]) < x_min:
            x_min = float(elements[i + 1])
        elif float(elements[i + 1]) > x_max:
            x_max = float(elements[i + 1])

        #find min and max y value
        if float(elements[i + 2]) < y_min:
            y_min = float(elements[i + 2])
        elif float(elements[i + 2]) > y_max:
            y_max = float(elements[i + 2])

        #find min and max x value
        if float(elements[i + 3]) < z_min:
            z_min = float(elements[i + 3])
        elif float(elements[i + 3]) > z_max:
            z_max = float(elements[i + 3]) 

        #incriment the counter int by 4 as we know the next 4 elements are not a vertex
        i += 4

    else:
        i += 1

print 'x_min = ' + str(x_min)
print 'x_max = ' + str(x_max)   
print 'y_min = ' + str(y_min)
print 'y_max = ' + str(y_max)
print 'z_min = ' + str(z_min)
print 'z_max = ' + str(z_max)
print ''
print 'x_widh = ' + (str(x_max - x_min))
print 'y_widh = ' + (str(y_max - y_min))
print 'z_widh = ' + (str(z_max - z_min))
.

и вот вывод, который я получаю

x_min = -5.0
x_max = 0.0
y_min = -5.0
y_max = 0.0
z_min = 0.0
z_max = 5.0

x_widh = 5.0
y_widh = 5.0
z_widh = 5.0
.

Надеюсь, что имеет смысл

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top