Semplice algoritmo python necessario nel trovare la scatola del limite di maglie da un file OBJ
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
. 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!
- Computa per ogni scatola delimitata la sua dimensione in dimensione X, y e z, ad esempio.:
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