Scomposizione di una maglia concava in una serie di maglie convesse


10

Vorrei poter scomporre una maglia concava in una serie di maglie convesse per 2 motivi:

  1. Rendering trasparente
  2. Forme fisiche

Esiste un algoritmo che accetta come input un set di triangoli (concavo) e genera un numero di set di triangoli (convesso)? Vorrei che non riempisse i buchi tra le parti della mesh originale.

Ho già trovato una piccola idea: trovare tutti i bordi concavi e dividere le maglie lungo i bordi dei bordi. Sono sulla buona strada? Come potrei implementarlo?


Che cos'è la mesh "concava / convessa"? Se mesh significa rete triangolare, allora è solo un insieme di triangoli, che sono convessi. O stai parlando del volume di oggetti 3D? Forse poliedri?
Ivan Kuckir,

Le reti @IvanKuckir, o poliedri, possono essere anche concave / convesse e la definizione è praticamente la stessa. Ad esempio, nessuna linea retta intersecherà l'interno del poliedro più di una volta.
congusbongus,

Risposte:


11

Direi che sei sulla buona strada, ma trovare un algoritmo ottimale e / o efficiente è un'altra questione: è un problema difficile. Tuttavia, a meno che il tuo interesse non sia accademico, potrebbe essere sufficiente una soluzione sufficientemente valida.

Innanzitutto, se non sei interessato a trovare la tua soluzione, CGAL contiene già un algoritmo per la decomposizione dei poliedri convessi: http://doc.cgal.org/latest/Convex_decomposition_3/index.html

Ora per il metodo; come molti problemi in 3D, è spesso utile considerare il problema 2D che è più facile da capire. Per il 2D, il compito è quello di identificare i vertici riflessi e dividere il poligono in due creando un nuovo bordo (e possibilmente nuovi vertici) da quel vertice riflesso, e continuando fino a quando non si rimane senza vertici riflessi (e quindi poligoni tutto convessi ).

vertici riflessi

La decomposizione poligonale di J. Mark Keil contiene il seguente algoritmo (in forma non ottimizzata):

diags = decomp(poly)
    min, tmp : EdgeList
    ndiags : Integer
    for each reflex vertex i
        for every other vertex j
            if i can see j
                left = the polygon given by vertices i to j
                right = the polygon given by vertices j to i
                tmp = decomp(left) + decomp(right)
                if(tmp.size < ndiags)
                    min = tmp
                    ndiags = tmp.size
                    min += the diagonal i to j
    return min

Fondamentalmente confronta in modo esaustivo tutte le possibili partizioni e restituisce quella con le diagonali minime prodotte. In questo senso è un po 'bruta e anche ottimale.

Se vuoi scomposizioni "più belle", ovvero quelle che producono forme più compatte piuttosto che allungate, potresti anche considerare questa prodotta da Mark Bayazit , che è avida (quindi molto più veloce) e sembra più bella ma ha alcune carenze. Funziona fondamentalmente cercando di collegare i vertici riflessi al migliore opposto ad esso, in genere a un altro vertice riflesso:

bayazit nuovo vertice bayazit si collega ad un altro vertice riflesso

Una delle carenze è che ignora "migliori" decomposizioni creando punti Steiner (punti che non esistono su un bordo esistente):

decomposizione del trifoglio usando due punti steiner

Il problema in 3D può essere simile; invece dei vertici riflessi, si identificano i "bordi di intaglio". Un'implementazione ingenua sarebbe quella di identificare i bordi della tacca ed eseguire ripetutamente tagli piani sul poliedro fino a quando tutti i poliedri sono convessi. Dai un'occhiata a "Partizioni convesse di poliedri: un algoritmo ottimale legato inferiore e caso peggiore" di Bernard Chazelle per maggiori dettagli.

poliedro con tacca

Si noti che questo approccio potrebbe produrre nel caso peggiore un numero esponenziale di sub-poliedri. Questo perché potresti avere casi degeneri come questo:

molti poliedri dentellati

Ma se hai una mesh non banale (pensa a una superficie irregolare), otterrai comunque scarsi risultati. È molto probabile che tu voglia fare molta semplificazione in anticipo, se mai dovessi usarlo per mesh complesse.


6

Il calcolo di una decomposizione convessa esatta di una superficie S è un problema NP-difficile e di solito produce un numero elevato di cluster. Per superare questi limiti, l'esatto vincolo di convessità può essere allentato e viene invece calcolata una decomposizione convessa approssimativa di S. In questo caso, l'obiettivo è determinare una partizione dei triangoli mesh con un numero minimo di cluster, garantendo al contempo che ogni cluster abbia una concavità inferiore a una soglia definita dall'utente.

Decomposizione convessa esatta vs. decomposizione convessa approssimativa

Consulta le seguenti librerie approssimative di decomposizione convessa: https://code.google.com/p/v-hacd/ http://sourceforge.net/projects/hacd/


0

Ecco un po 'di codice che potrebbe aiutarti. È in Java, quindi dovrai convertirlo in c ++.

Ecco anche un altro articolo che può aiutarti


1
Ciao Masked Rebel, le risposte solo link sono scoraggiate qui. Se l'URL dovesse mai cambiare o la risorsa non fosse disponibile, può lasciare risposte che dipendevano completamente dal collegamento completamente vuoto di soluzioni per gli utenti futuri. È fantastico fornire link per il credito e ulteriori letture, a condizione che la tua risposta possa ancora essere autonoma e fornire una guida per risolvere il problema anche prima che il lettore scatti in profondità. Ti preghiamo di considerare di modificare questa risposta per includere almeno una descrizione generale di come funziona la soluzione a cui stai collegando.
DMGregory

@DMGregory Per favore cancella la risposta che non posso.

La risposta non ha necessariamente bisogno di essere cancellata. Basta modificarlo per includere alcune informazioni aggiuntive potrebbe renderlo un'ottima risposta.
DMGregory

@DMGregory, ma sarà un duplicato di un'altra risposta su questo post. Modificherò solo l'altra risposta e inserirò qui le mie informazioni.

Presumo che tu abbia sentito di avere qualcosa di nuovo da aggiungere quando hai condiviso questa risposta in primo luogo. Non dubito che tu possa spiegare il codice che hai collegato in un modo che non è una copia carbone di una risposta esistente. Se preferisci eliminarlo, tuttavia, il link per farlo è disponibile nella versione desktop del sito.
DMGregory
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.