Transformar uma N-Ary B-Spline em uma sequência de quadrático ou cúbico B-Splines
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.
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 ..