Превратите N-Арный B-сплайн в последовательность квадратичных или кубических B-сплайнов
Вопрос
Я выполняю некоторую работу 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.Дайте мне знать, если у вас возникнут какие-либо проблемы..