Transformar uma N-Ary B-Spline em uma sequência de quadrático ou cúbico B-Splines

StackOverflow https://stackoverflow.com/questions/355192

  •  21-08-2019
  •  | 
  •  

Pergunta

Eu estou fazendo algum trabalho TTF para MOSA (o corpo correlacionando entre todos os sistemas C # operacionais). Eu e Colin Queime estão actualmente a trabalhar em obter algum código TTF de trabalho (menos me nestes dias :) - ele fez um monte de progresso).

Em qualquer caso, a especificação TTF permite uma quantidade arbitrária de pontos de controle entre as 'pegas' e suspiro NÃO alças em tudo (o TTF tem um exemplo de um círculo demonstrando que - bem feito idiotas - você salvou 10 bytes)

.

Alguém pode me dar um ponteiro sobre como isso poderia ser feito? Olhei para o artigo Bezier na Wikipedia, mas não era realmente que muito ajuda - eles mostram que isso aconteça, mas não dão nenhuma matemática. 'Programa' algo pronto ajudaria (meu cálculo não é o que deveria ser.) - alguns pseudocódigo ou algo

Obrigado rapazes.

Foi útil?

Solução

Eu fiz alguma escavação e encontrou alguns algoritmos para a especificação TTF sobre a neste site aqui .

Outras dicas

A partir da Bezier artigo na wikipedia, com algum conhecimento prático cálculo, você pode traduzir o fórmulas para um programa de computador como o seguinte código pseudo C # listagem. Eu estou fazendo isso com ranhura quadrática, mas é fácil de traduzir para outro.

// Quadratic spline, with three given points
// B(t) = (1-t)^2P(0) + 2*tP(1) + t^2P(2)
// where T is a real number in the interval [0, 1]

public void DrawQuadSpline(Point p0, Point p1, Point p2, int steps) 
{
    Point next = p0;
    Point previous = p0;
    double tStep = 1 / ((float) steps);
    double t = 0;
    for (int i = 0; i < steps; i++) 
    {
        float x = CalculateQuadSpline(P0.x, P1.x, P2.x, t);
        float y = CalculateQuadSpline(P0.y, P1.y, P2.y, t);
        Point next = new Point(x, y);
        drawLine(previous, next);
        previous = next;
        t = t + tStep;
    }
} 

private void CalculateQuadSpline(float z0, float z1, float z2, float t) 
{
    return (1.0-t)*(1.0-t)*z0 + 2.0*t*z1 + t*t*z2;
}

Ele pode precisar de alguns ajustes como eu só fiz isso em Java antes, mas é basicamente isso.

Ok, parece que contornos TTF são definidos como b-splines quadráticas.

Existem dois algoritmos que você vai querer estar familiarizado.

O primeiro é através de extracção de Bezier inserção nó. Isto fará você segmentos Bézier quadrática. Então você vai querer grau-elevar cada segmento de Bezier para obter cúbicas.

O uso principal referência que é meu livro classe CAGD, que é online. extracção de Bezier é coberto em secção 6.3 . elevação grau de curvas de Bezier é coberto em seção 2.4 . Deixe-me saber se você tiver quaisquer problemas ..

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