Semplice algoritmo python necessario nel trovare la scatola del limite di maglie da un file OBJ

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

  •  11-12-2019
  •  | 
  •  

Domanda

Sto provando un problema di imballaggio usando i file Python e Obj. Sono un novizio in Python e non sono sicuro di come manipolare i vertici dei file OBJ per trovare il riquadro di delimitazione ottimale. Qualsiasi codice Python di esempio per farmi iniziare? Ecco un semplice file box obj da iniziare con il quale dovrò adattarmi in un contenitore più grande. In breve, può oggetto x adattarsi all'oggetto Y. Allora, in definitiva, quanti X può adattarsi a Y con la soluzione più ottimale, ma è per il modo in seguito.

Ecco i file .obj per le scatole piccole e più grandi Piccolo:

# 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/08/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/10/16 14/11/14 13/04/13 15/11/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/2018/18 17/11/17 19/01/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/03/24 22/12/012 21/01/21 23/21/23/23

Bigger Box:

# 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/80 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/10/16 15/11/15 13/04/11 14/11/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/2019 19/01/19 17/11/17 18/01/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/03/24 23/12/03/23 21/21/21 22/22/22

enter code here
.

È stato utile?

Soluzione

Prima di rispondere alla domanda nel tuo titolo:

    .
  • carica ciascun file oggetto come un elenco di vertici, presumo che tu sia già un codice per caricare i file .obj in Python (se no, è possibile regolare questo loadobj () Funzione per esempio, fallo restituire la variabile verts)
  • Per ogni oggetto, calcola il riquadro di delimitazione, ad esempio.:
    .
    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))
    
    .
    .

    Ora su per testare se un oggetto "si adatta" nell'altro.Fondamentalmente, vuoi sapere se una scatola di delimitazione è uguale o più piccola dell'altra in tutte le dimensioni, come ti capisco. Quindi,

      .
    • Computa per ogni scatola delimitata la sua dimensione in dimensione X, y e z, ad esempio.:
      .
      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)
      
      .
      .

      Buona fortuna!

Altri suggerimenti

Volete iterare sui dati OBJ alla ricerca di "V e controllando se la seguente x y e z coordina e registrare il valore più alto e basso ogni volta che si incontra.Il seguente codice stampa il valore più alto e più basso per ogni dimensione e ti dà il riquadro di delimitazione da quello

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))
.

E ecco l'uscita che ottengo

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
.

Spero che abbia senso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top