OpenGL: Как нарисовать кривую Безье степени выше 8? - PullRequest
0 голосов
/ 24 апреля 2010

Я пытаюсь нарисовать кривую Безье высокого порядка, используя оценщики OpenGL:

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 30, &points[0][0]);

glMapGrid1f(30, 0, 1);
glEvalMesh1(GL_LINE, 0, 30);

или

glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 30; i++) 
  glEvalCoord1f((GLfloat) i/30.0);
glEnd();

Когда количество точек превышает 8, кривая исчезает. Как нарисовать кривую Безье более высокого порядка, используя оценщики?

Ответы [ 2 ]

1 голос
/ 07 ноября 2012

см. Статью:

Уоткинс и Уорси, Степень снижения кривых Безье. Системы автоматизированного проектирования. 20 (7), сентябрь 1988 г., 398-405

Что они делают, так это конвертируют кривую Безье в полиномиальную форму Чебышева, поэтому последний член полинома оказывает наименьшее влияние на форму, отбрасывает последний член и возвращает его обратно в форму Безье. Если это приводит к слишком большой ошибке, Безье подразделяется и процесс запускается снова.

Это позволяет очень легко преобразовать кривую высокого порядка в кубический Безье, который система может эффективно визуализировать. Я использовал этот метод для пары разных ситуаций, и он хорошо работает. Одна оговорка, хотя; матричные уравнения в статье имеют некоторые опечатки. См:

Петерсон Дж., Письмо в редакцию , CAD, 23 (6), август 1991 г., с.460

для исправленных уравнений. К сожалению, CAD является академическим журналом старой школы, поэтому статьи не всегда доступны в Интернете. Вам нужно будет где-то выкопать их из библиотеки или заплатить штраф, чтобы получить их от Elsevier.

0 голосов
/ 04 мая 2010

Случайно ли вы получаете ошибку GL_MAX_EVAL_ORDER? Кривые Безье становятся неустойчивыми при высоких градусах. Я не удивлюсь, если ваша реализация OpenGL просто сдалась.

Вы можете использовать glGet с GL_MAX_EVAL_ORDER, чтобы увидеть, на что ваша реализация максимально. Если вам нужно что-то более высокое, вы всегда можете бросить свое, что не так уж плохо.

...