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

votos
2

Eu estou fazendo algum trabalho TTF para MOSA (o corpo de correlação 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 ofegar NO lida 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 assim.

Obrigado rapazes.

Publicado 10/12/2008 em 07:00
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

A partir do artigo Bezier em wikipedia, com algum conhecimento prático cálculo, você pode traduzir as fórmulas para um programa de computador como o seguinte pseudo C lista # código. 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.

Respondeu 10/12/2008 em 07:29
fonte usuário

votos
1

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.

A principal referência que eu uso é o meu livro classe CAGD, que é online. Extracção de Bezier é coberto na 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 ..

Respondeu 10/12/2008 em 21:47
fonte usuário

votos
1

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

Respondeu 10/12/2008 em 08:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more