Сижу второй день "курю" всяческую инфу по поводу NURBS. При этом складывается такое ощущение, что все статьи по ним специально написаны таким образом, чтобы было ни хрена не понятно, как из этих формул перейти к конкретным вычислениям для конкретной задачи.
Тем не менее, по ходу изучения я выяснил, что кривые Безье являются частным случаем NURBS, которые, в свою очередь, являются нерегулярными B-сплайнами (буквочки BS в слове NURBS это как раз от b-spline). То есть, кривая Безье это b-spline, у которого количество опорных точек равно степени кривой + 1. У квадратичной получаем 3 опорных точки, у кубической, соответственно, 4 точки. Ну и так далее.
Ещё немного посидев над этим делом, я понял, что тот алгоритм, который я использовал для расчёта точек кривых Безье можно модифицировать для расчёта NURBS с произвольным количеством опорных точек. Но пока это только для 2д режима. Как это прикрутить к 3д поверхностям, нужно ещё разбираться.
Да, по поводу автокада. Насколько я понял, они используют NURBS только при моделировании 3д поврехностей. При построении 2д сплайнов у них какой-то другой алгоритм, поскольку кривая проходит через сами точки, а у NURBS она проходит только в первой и последней точке, как у кривой Безье. Так что, скорее всего, это просто кубические сплайны, а не NURBS.
По поводу 2, то есть дуг в полилиниях. Ты не думал сделать средний слой, чтобы не переделывать нижний уровень движка? То есть, преобразовывать дуги и вообще любые кривые в набор отрезков, у уже потом этот набор отрезков рисовать тем движком, который есть. Нужно будет только правильно задать количество сегментов разбиения. Чем больше сегментов, тем выше точность и гладкость кривой. Автокад, как мне кажется, до сих пор так с окружностями работает.
Добавлено спустя 11 минут 17 секунд:Для редактирования нужно уметь считать ближайшую точку на кривой до курсора мыши (в зкаде курсор это прямая из камеры в 2д курсор мыши). Параметрическую точку на кривой, ну и расчет длины кривой - чтоб можно было легко находить середину, треть, четверть и т.п.
Ближайшую точку на кривой в принципе можно вычислять по аппроксимирующей полилинии из прямых отрезков, если разбиение достаточно большое. Хотя, не совсем понятно, для чего это надо, поскольку кривая Безье обычно редактируется через управляющие точки, а не через положение самой линии. Для выделения объекта вполне достаточно будет результирующей полилинии из отрезков. А после выделения нужно отобразить управляющие точки, и перемещать уже их.
Написать функцию для нахождения произвольной точки по параметру t, где 0 <= t <= 1, вообще не проблема. Нужно только немного переделать те функции, которые есть.
Что касается нахождения середины, четверти, трети и т.п., это тоже не проблема, если решена предыдущая задача, которая возвращает координаты точки по параметру t, поскольку середина это t=0.5, четверть это t=0.25 и т.д. Тут длину в принципе вычислять не нужно.