2009-10-14 19 views
3

Je m'intéresse aux triangles bezier quadratiques que j'essaie de tester pour les rendre.comment tesselate bezier triangles?

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

En particulier j'aurais besoin d'un algorithme adaptatif de tesselation qui me permette de définir la quantité de segments sur les bords. Je ne suis pas sûr si je peux obtenir cela si bien que j'aimerais aussi entendre parler de techniques de tesselation uniformes.

Problème le plus difficile J'ai du mal à calculer les normales pour un point dans la surface de Bézier, ce dont je ne suis pas sûr si j'ai besoin, mais essayait de résoudre.

Répondre

1

Tesselation adaptative. Il y a beaucoup d'algorithmes à cela. Mais en 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 trianguler des triangles de cette façon il y a des complications à la matière. Vous devez piloter l'algorithme adaptatif de tesselator selon les angles des beziers de bord. Il y a trois façons uniques de diviser votre triangle lors de la tesselation. Définissez les résultats de la tesselation pour ces modèles et vous êtes bien lotis. Seule la tesselation avec un bord est décrite dans l'article wikipedia.

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

"2 arêtes" peuvent être obtenues en découpant d'abord un bord puis un autre.

"3 bords" est un peu plus de travail à découvrir. Mais vous pouvez voir les "2 bords" -case vous apporte un milieu de bord. Dans le cas du triangle bezier quadratique, il s'agit d'une somme moyenne de losange qui apparaît:

--------  /\ 
\ / /\ 
\____/  -____- 
    \/  \/
    \/   \/