Превратите N-Арный B-сплайн в последовательность квадратичных или кубических B-сплайнов

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

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Из Статья из Безье в Википедии, обладая некоторыми практическими знаниями в области исчисления, вы можете перевести формулы в компьютерную программу, подобную следующему списку псевдокода 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, но в принципе это все.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top