Question

Ma préoccupation sont des triangles de Bézier que je suis en train de tesselate pour les rendre.

J'ai réussi à mettre en œuvre ce en subdivisant le triangle récursive comme décrit dans une page wikipedia. Bien que je voudrais obtenir plus de précision à subdivision. Le problème est que je vais soit obtenir trop peu ou trop de subdivisions parce que la quantité de surfaces double à chaque itération de cet algorithme.

En particulier, je aurais besoin d'un algorithme de tesselation adaptatif qui me permet de définir la quantité de segments sur les bords. Je ne sais pas si je peux obtenir que si donc je voudrais aussi entendre sur les techniques de tesselation uniformes.

Hardest mal que j'ai du mal avec le calcul Normales pour un point dans la surface de Bézier, que je ne suis pas sûr que j'ai besoin, mais essaie de résoudre sur.

Était-ce utile?

La solution

tesselation Adaptive. Il existe de nombreux algorithmes à cela. Mais voici un:

def line_angle((x0,y0),(x1,y1)):
    return atan2(y1-y0,x1-x0)

def adaptive_bezier(p0,p1,p2,lev=32):
    p01 = midpoint(p0,p1)
    p12 = midpoint(p1,p2)
    m = midpoint(p01, p12)
    da = abs(line_angle(p0,p1) - line_angle(p1,p2))
    if da <= max_tolerance or lev <= 0:
        yield m
    else:
        for p in adaptive_bezier(p0,p01,m,lev-1): yield p
        for p in adaptive_bezier(m,p12,p2,lev-1): yield p

Pour triangles tesselating cette façon il y a des complications à la question. Vous devez conduire l'algorithme adaptatif tesselator selon les angles des beziers bord. Il y a trois façons uniques comment votre triangle peut diviser quand tesselating.

 2 edges      one edge     3 edges    
--------     ---------    --------
\  ...//     \   |   /    \ /  \ /
 \/___/       \  |  /      \____/
  \  /         \ | /        \  /
   \/           \|/          \/

Définir les résultats de tesselation pour ces modèles et vous êtes bien au large. Seul le tesselation avec un bord est décrit dans l'article de wikipedia.

Deux autres résultats de tesselation peuvent être obtenus en étudiant le cas d'un bord fendu.

« 2 arêtes » peuvent être obtenus directement par fractionnement d'abord un bord puis l'autre.

« 3 arêtes » est un peu plus de travail pour le savoir. Mais vous pouvez voir le -cas « 2 bords » vous apporte un milieu de bord. Dans le cas du triangle de Bézier est une somme moyenne du diamant, il apparaît:

--------      /\
\      /     /  \
 \____/     -____-
  \  /       \  /
   \/         \/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top