Curvas circulares de 2ª ordem

Como você sabe , as curvas de Bézier não podem construir um arco de círculo ou uma elipse. Este artigo discute curvas que não apresentam essa desvantagem.







Curvas de Bézier



A lógica por trás da construção das curvas de Bézier é bem compreendida a partir da seguinte animação:







Para obter a fórmula diretamente da representação gráfica, basta definir uma função auxiliar para interpolação linear entre dois pontos, na qual, quando o parâmetro t muda de 0 para 1, ele retorna valores intermediários de a para b :



mEux(uma,b,t)=uma(1-t)+bt

Nota
- lerp, blend, mix - . .




Com sua ajuda, você pode encontrar consistentemente os pontos necessários - primeiro encontre

umac=mEux(uma,c,t)

e

cb=mEux(a partir de,b,t)



e então através deles encontre

d=mEux(umac,cb,t)



Se desejar, você pode substituir as funções umas nas outras e reduzir - embora isso não simplifique particularmente os cálculos, permitirá que você generalize as curvas para um número arbitrário de pontos de controle (via polinômios de Bernstein). No nosso caso, temos



d=uma(1-t)2+bt2+2ct(1-t)



O aumento da ordem das curvas é alcançado trivialmente - os pontos iniciais não são definidos como constantes, mas como resultado da interpolação entre n + 1 outros pontos de controle:





Nota
, . .


Curvas circulares





Arco de círculo



Para construir um arco circular de maneira semelhante, é necessário determinar a lógica de construção apropriada - por analogia com o desenho de um círculo com um compasso.





Inicialmente, nós não sabemos o centro do círculo d - ela é encontrada através da intersecção das perpendiculares às tangentes em pontos de um e b (doravante nodal); as próprias tangentes são especificadas no ponto c (a seguir designada orientação). Para criar um arco circular arbitrário (menor que 180 °), é suficiente que as distâncias do ponto de direção aos pontos nodais sejam iguais.





Arco de elipse



Construir um arco de elipse já é mais difícil - você precisa de dois vetores girando em direções diferentes ( mais detalhes aqui )





Usando o método acima para encontrar o ponto d , não podemos mais construir um arco arbitrário de uma elipse - apenas de 0 ° a 90 ° (incluindo girado por um certo ângulo).



Arco hipotrocoide



Estabelecendo a condição de que no início e no final do desenho os vetores devem estar em uma linha reta, obtemos o arco do hipotrocoide em todos os outros casos. Esta condição não é acidental e (além da definição única da curva) garante a coincidência das tangentes nos pontos nodais. Como consequência, os caminhos angulares que os dois vetores percorrem serão diferentes, mas ainda somam 180 °.





Como a forma da curva muda dependendo da posição do ponto guia pode ser visto na seguinte animação:







Algoritmo



Visto que aqui temos rotações em um plano bidimensional, é conveniente descrever a matemática da construção dessas curvas em termos de números complexos.



1) encontre o ponto de intersecção das normais das tangentes traçadas a partir do ponto de direção para os pontos nodais:



d=(2uma-c)(c-b)uma+(2b-c)(uma-c)b-c(uma-b)c(c-b)uma+(uma-c)b-(uma-b)c

(aqui o asterisco significa conjugação complexa).



2) conhecendo d , encontramos os comprimentos dos normais



rde Anúncios=|uma-d|

rbd=|b-d|





e sua soma e diferença



rm=12(rde Anúncios+rbd)

rs=12(rde Anúncios-rbd)





3) encontre o vetor unitário a partir do qual a construção começa



v=uma-d|uma-d|



Nota
sign(x).





4) encontre os caminhos angulares que cada um dos vetores deve passar



ϕm=arg(uma-db-d)

ϕs=arg(-uma-db-d)



Nota
, — . — , . . .



, — , - ; .



. ,

arg(uma-d)-arg(b-d)



— - .


5) mudando sucessivamente t de 0 a 1 com algum passo, encontramos o ponto pertencente à curva pela fórmula



d+v(rme-Eutϕm+rse-Eutϕs)





Estrias circulares



Assim como as curvas de Bézier, essas curvas podem ser combinadas para criar splines contínuas por partes. Para garantir suavidade nos pontos de ancoragem (ancoragem), o ponto de ancoragem deve estar alinhado com dois pontos de direção adjacentes. Para fazer isso, você pode especificar pontos de ancoragem não explicitamente, mas por meio da interpolação de pontos de guia. Eles também não podem ser configurados de forma alguma, calculando de forma totalmente automática - por exemplo, como a média entre os pontos-guia:







À direita, para comparação, a mesma abordagem foi usada com curvas de Bezier de 2ª ordem.



Notas e nuances



Ao contrário das curvas de Bézier, aqui a curva nem sempre está dentro da forma das linhas que conectam os pontos de controle, por exemplo





Além disso, há um caso degenerado que precisa ser tratado separadamente - quando o ponto de direção fica na mesma linha dos pontos de ancoragem. Nesse caso, a curva degenera em linha reta e, ao tentar calcular o ponto d , ocorre a divisão por zero.



Essas curvas também têm restrições quanto à curvatura da linha, pois o algoritmo escolhe o menor caminho a seguir e a curva não pode ultrapassar 180 °. Isso leva ao fato de que com a interpolação contínua por partes, cantos agudos podem ocorrer em uma determinada posição dos pontos de direção (à direita - os mesmos pontos para Bézier):







Conclusão



Um desenvolvimento adicional do método considerado de construção de curvas é um aumento no número de vetores envolvidos na construção da curva e, consequentemente, um aumento no número de pontos de direção. No entanto, ao contrário das curvas de Bézier, aumentar a ordem aqui não é óbvio e requer uma reflexão cuidadosa separada. Vários métodos de combiná-los com curvas de Bézier também são possíveis - em particular, a interpolação do centro do círculo de vetores de desenho.



O método considerado de construção de curvas também não é o único, um caso particular do qual são arcos de um círculo e uma elipse - pelo menos uma elipse pode ser construída através da interseção de linhas retas em um paralelogramo(entretanto, nesta versão o autor falhou). É possível que existam outras soluções, incluindo opções descritas no artigo - escreva nos comentários se souber algo sobre o assunto.



O código-fonte do artigo pode ser baixado do GitHub .



All Articles