Penso che 3d Bresenham sia la strada da percorrere, appena ottimizzato un po '. Come primo passo al problema, procedi come Bresenham, ma sii sospettoso quando stai per fare un passo, o hai appena fatto un passo, dato che questi sono i posti in cui la linea potrebbe passare attraverso altre celle.
Per semplicità, supponiamo che z
è dominante, nel senso che z
incrementi ogni passo. La domanda 3d Bresenham è: "quando incrementiamo/decrementiamo in x
o ?" La risposta è quando l'errore accumulato in x
raggiunge .5 o quando l'errore è y
o entrambi.
Per il vostro caso, penso che è necessario disporre di una soglia secondaria che utilizza slopeY = deltaY/deltaZ
per decidere se la linea è in procinto di attraversare in una cella vicina. Se stepZ
è la modifica di z lungo la linea per ciascun pixel, un test come error > .5 - slopeY/stepZ
dovrebbe indicare di ottenere celle su entrambi i lati della linea in . Un test simile ti dice se devi ottenere la cella in più in x
. Se devi ottenere la cella in più in entrambe le xe y, allora devi ottenere la cella diagonale anche alla cella di Bresenham.
Se hai rilevato che si è aggiunto una cella y
prima che l'incremento, non sarà aggiungere una cella dopo. Se non hai aggiunto una cella prima, dovrai farlo dopo, a meno che non ti sia capitato di passare attraverso un angolo della cella. Come gestisci ciò dipende dal tuo caso d'uso.
Questi sono i miei pensieri sul problema, non ho provato nulla, ma qualcosa del genere dovrebbe funzionare.
fonte
2013-05-12 10:11:49
Questo potrebbe essere basato su integer come da Bresenhams? https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm – occulus