Превратите N-арный B-сплайн в последовательность квадратичных или кубических B-сплайнов - PullRequest
2 голосов
/ 10 декабря 2008

Я делаю некоторую работу TTF для MOSA (коррелирующее тело между всеми операционными системами C #). Я и Колин Бёрн в настоящее время работаем над тем, чтобы заставить работать некоторый код TTF (в наши дни меньше меня :) - он добился большого прогресса).

В любом случае, спецификация TTF допускает произвольное количество контрольных точек между «ручками» и удушье НИКАКИХ ручек вообще (у TTF есть пример круга, демонстрирующего это - молодцы идиоты) - вы сохранили 10 байт).

Может кто-нибудь дать мне указатель на то, как это можно сделать? Я посмотрел на статью Безье в Википедии, но это не сильно помогло - они показывают, что это происходит, но не дают никакой математики. Поможет что-то готовое «программа» (мой Исчисление не то, чем должно быть) - какой-то псевдокод или что-то еще.

Спасибо, ребята.

Ответы [ 3 ]

3 голосов
/ 10 декабря 2008

Из статьи Безье в Википедии, с некоторыми практическими знаниями исчисления, вы можете перевести формулы в компьютерную программу, например, следующий псевдо-код на C #. Я делаю это с квадратичным сплайном, но его легко перевести на другой.

// 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;
}

Возможно, потребуется немного доработать, так как раньше я делал это только на Java, но это все.

1 голос
/ 10 декабря 2008

Хорошо, похоже, контуры TTF определены как квадратичные b-сплайны.

Есть два алгоритма, с которыми вы захотите ознакомиться.

Первое - это извлечение Безье через вставку узла. Это даст вам квадратичные сегменты Безье. Затем вы захотите повысить степень каждого сегмента Безье, чтобы получить кубики.

Основным справочным материалом, который я использую, является мой учебник по классу CAGD, который находится в Интернете. Извлечение Безье рассматривается в разделе 6.3 . Степень возвышения кривых Безье описана в разделе 2.4 . Дайте мне знать, если у вас возникнут проблемы.

1 голос
/ 10 декабря 2008

Я немного покопался и нашел алгоритмы для спецификации TTF на этом сайте здесь .

...