Veja também: mesma pergunta no Math.SE
Como posso encontrar o comprimento de arco de uma curva de Bezier? Por exemplo, uma curva linear de Bezier tem o comprimento:
length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
Mas e as curvas de Bezier quadráticas, cúbicas ou n graus?
(Meu objetivo era estimar uma resolução de amostragem de antemão, para não perder tempo verificando se o próximo ponto está tocando o ponto anterior.)
mathematics
graphics
beziers
heuristics
Mateen Ulhaq
fonte
fonte
Respostas:
Uma maneira simples para Beziers cúbicos é dividir a curva em N segmentos e somar os comprimentos dos segmentos.
No entanto, assim que você precisar do comprimento de apenas parte da curva (por exemplo, até um ponto 30% do comprimento), a parametrização do comprimento do arco entrará em jogo. Postei uma resposta bastante longa em uma de minhas perguntas sobre Béziers, com um exemplo simples de código.
fonte
1.0/t
(chamadoresolution
), então isso é para "tempo real" (que é no máximo 10fps no lento NXT). Toda iteração,,t += resolution
e um novo ponto / linha são desenhados. De qualquer forma, obrigado pela ideia.Embora eu esteja de acordo com as respostas que você já obteve, quero adicionar um mecanismo de aproximação simples, mas poderoso, que você pode usar para qualquer curva de Bézier: Você subdivide continuamente a curva usando a subdivisão de Casteljau até a distância máxima dos pontos de controle de uma sub-curva para a linha de base da sub-curva está abaixo de algum epsilon constante . Nesse caso, a subcurva pode ser aproximada por sua linha de base.
De fato, acredito que essa é a abordagem geralmente adotada quando um subsistema gráfico precisa traçar uma curva de Bézier. Mas não me cite, não tenho referências em mãos no momento.
Na prática, será assim: (exceto que o idioma é irrelevante)
fonte
Os comprimentos do arco para as curvas de Bezier são apenas de forma fechada para os lineares e quadráticos. Para cubicos, não é garantido que você tenha uma solução fechada. O motivo pelo qual o comprimento do arco é definido por uma integral radical, para a qual somente os polinômios de 2º grau foram fechados.
Apenas para referência: o comprimento de um Bezier quadrático para os pontos (a, p) (b, q) e (c, r) é
Onde LN é o logaritmo natural e ^ denota potência e √ a raiz quadrada.
Portanto, deve ser mais fácil e barato aproximar o arco de alguma outra regra, como um polígono ou um esquema de integração como a regra de Simpson, porque as raízes quadradas do LN são operações caras.
fonte
Elaborei a expressão fechada de comprimento para um Bezier de 3 pontos (abaixo). Não tentei elaborar um formulário fechado para mais de 4 pontos. Isso provavelmente seria difícil ou complicado de representar e manipular. No entanto, uma técnica de aproximação numérica, como o algoritmo de integração Runge-Kutta, funcionaria muito bem ao integrar usando a fórmula de comprimento do arco . Minhas perguntas e respostas sobre o RK45 no MSE podem ajudar na implementação do RK45.
Aqui está um código Java para o comprimento do arco de um 3 pontos Bezier, com pontos
a
,b
ec
.fonte