2013-03-27 13 views
7

Sto lavorando all'utilità di affettatura mesh per scopi di stampa 3D. In generale, dovrebbe tagliare un modello di mesh 3D in forme 2D (un numero di poligoni, probabilmente con fori) e riempirle con percorsi di spessore determinato utilizzando un modello specifico. Questi percorsi verranno utilizzati per generare comandi gcode per un firmware di stampante 3D.Algoritmo di riempimento poligono

Esistono vari strumenti open source con gli stessi scopi, scritti su python e perl. Ma il mio obiettivo è capire il flusso di lavoro di slicer e scrivere il mio strumento in C o C++.

Finora sono in grado di ottenere il contorno della fetta e ora li riempirò di percorsi. Il problema è che non ho trovato un algoritmo efficiente per farlo. Un processo schematico di esempio di riempimento:

Qualcuno può consigliare come generare questi percorsi di riempimento? Grazie.


Attualmente sto usando il seguente algoritmo:

  1. Trova un riquadro della forma
  2. Split bb verticalmente con le linee (numero di righe = bb.width/path.thickness)
  3. punti di intersezione Ricerca per forma e ogni linea (dovrebbero essere due punti per linea)
  4. costruire un segmenti da questi punti con offset dal contorno
  5. .210
  6. Aggiungere a segmenti che si collega un segmenti originali insieme formando una striscia linea
  7. Siamo pronti a generare gcode o disegnare un percorso

Simple infill algorithm

Questo è semplice e algoritmo veloce, ma fa non funziona per poligoni concavi e poligoni con fori. Inoltre usa solo un modello specificato.

+0

Entrambi i punti sulla figura sono blu. Uno di loro dovrebbe essere verde? – ElKamina

+0

Inoltre, quali sono le restrizioni sul percorso di riempimento? – ElKamina

+0

Si prega di notare che ci sono due percorsi diversi e ognuno ha punti di inizio e di fine. – san

risposta

2

Dopo un po 'di tempo di ricerca, ho terminato con il seguente algoritmo: enter image description here Tuttavia, ci sono diverse opportunità di ottimizzazione.

2

Si consiglia di esaminare this webpage sugli algoritmi per l'applicazione di tratteggio alle regioni.

+2

Sembra vicino alle mie esigenze e interessante da leggere, ma sfortunatamente non ha dettagli e teorie su come implementare il riempimento. Spiega come usare un software. – san

7

L'approccio seguente produrrà un modello di riempimento costituito da un singolo percorso (ovvero, l'ugello di riempimento non verrà mai spento, spostato e riattivato) ogni volta che ciò è possibile.

Dopo il passaggio 4 ("Costruisci segmenti da questi punti con offset dal limite"), trasforma ciascun segmento di linea verticale in 2 o più punti: il punto superiore e inferiore, più (immagina che il diagramma sia disegnato su un diapositiva trasparente, posizionare un pezzo di carta con linee orizzontali al di sotto e contrassegnare dove i segmenti della linea verticale nel diagramma intersecano le linee orizzontali sulla carta).

Ora forma un grafico ponderato sul bordo contenente un vertice per ogni punto, con un bordo che collega due vertici ogni volta che i punti corrispondenti sono inferiori o uguali a un'unità di griglia. Aggiungete anche i bordi tra i punti più alti adiacenti dei segmenti di linea e tra i punti più in basso adiacenti. Usa la distanza euclidea tra i punti per il peso del bordo.Infine, la parte magica: trova un peso minimo Hamiltonian path su questo grafico. Questo è un percorso che visita ogni vertice esattamente una volta e ha una lunghezza minima. Il vincolo di lunghezza minima garantisce che il percorso non si incrocerà mai, poiché se due linee si incrociano, ad esempio la linea da a a b e la linea da c a d, allora sarebbe sempre possibile creare un percorso complessivo più breve eliminandole due linee e creando due nuove linee usando una diversa combinazione di endpoint (a --- c eb --- d oppure a --- d eb --- c). Questo è il percorso che riempirai.

Trovare un percorso hamiltoniano (per non parlare di un percorso hamiltoniano a peso minimo) è un problema NP-hard che è strettamente correlato al più famoso problema del venditore ambulante. Poiché esistono già molti solutori TSP precisi (ad es. Concorde), sarebbe opportuno utilizzare uno di questi per trovare un tour di un commesso viaggiatore e quindi semplicemente eliminare uno dei bordi per produrre un breve percorso hamiltoniano. (Anche se elimini il bordo più pesante, questo non produrrà necessariamente un percorso hamiltoniano di lunghezza minima, poiché potrebbe esserci che esistono percorsi più brevi che non iniziano e finiscono ai vertici adiacenti, ma non ci interessa davvero lunghezza totale qui, vogliamo solo un percorso che visita tutti i vertici e non attraversa se stesso.)

Sfortunatamente, non è garantito che un grafico contenga un percorso hamiltoniano o un tour di un commesso viaggiatore. (Ovviamente non possono esistere se il grafico è disconnesso, ad esempio, ma anche i grafici collegati possono non avere uno o entrambi: ad esempio un grafico con qualsiasi vertice di grado 1 non può avere un tour TSP.) In questo caso, se il Il solutore TSP che stai utilizzando può trovare tour che non visitano tutti i vertici, puoi semplicemente ripetere questo fino a coprire tutti i vertici. In caso contrario, ricorreremo al tuo algoritmo originale.

+0

Una complicazione aggiuntiva: il percorso deve essere significativamente diverso dal percorso del livello precedente, anche se i due livelli hanno la stessa geometria. Come faresti a garantire che i percorsi siano sempre significativamente differenti ogni volta? – AJMansfield

+1

@ AJMansfield: buona domanda, per cui penso di avere una buona risposta! Basta aggiungere una piccola quantità casuale a ciascun peso del bordo :) Ciò presuppone che nel grafico siano presenti molti percorsi hamiltoniani di uguale peso (questo sarà generalmente il caso di grafici molto regolari). Per garantire che i percorsi con incroci continuino a essere evitati, è sufficiente assicurarsi che la somma di tutte le somme casuali aggiunte sia inferiore a sqrt (2) -1. –