Pergunta

Minha preocupação são triângulos quadráticos de Bezier, que estou tentando fazer beliscões por torná -los.

Consegui implementar isso subdividindo o triângulo recursivamente como descrito em uma página da Wikipedia. Embora eu queira obter mais precisão à subdivisão. O problema é que eu receberei muito poucas subdivisões ou muitas, porque a quantidade de superfícies dobra em todas as iterações desse algoritmo.

Em particular, eu precisaria de um algoritmo adaptativo de teselação que me permita definir a quantidade de segmentos nas bordas. Não tenho certeza se posso conseguir isso, então também gostaria de ouvir sobre técnicas uniformes de teselation.

Problemas mais difíceis que tenho problemas para calcular normais para um ponto na superfície de Bezier, que não tenho certeza se preciso, mas tenho tentado resolver.

Foi útil?

Solução

Tesselation adaptável. Existem muitos algoritmos nisso. Mas aqui está um:

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

Para triângulos de teselacionamento dessa maneira, há complicações no assunto. Você precisa impulsionar o algoritmo adaptativo do Tesselator de acordo com os ângulos do Edge Beziers. Há três maneiras únicas de como seu triângulo pode se dividir ao fazer uma tesada.

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

Defina os resultados da teselação para esses padrões e você estará bem. Somente a tesselação com uma borda é descrita no artigo da Wikipedia.

Dois outros resultados de teselação podem ser obtidos estudando o caso de uma divisão de uma borda.

"2 arestas" pode ser obtido diretamente dividindo a primeira borda e depois a outra.

"3 arestas" é um pouco mais de trabalho para descobrir. Mas você pode ver o caso "2 arestas", traz uma ponta média. No caso do triângulo quadrático Bezier, é uma soma média de diamante que aparece lá:

--------      /\
\      /     /  \
 \____/     -____-
  \  /       \  /
   \/         \/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top