У меня есть список 2d точек, которые являются управляющими вершинами (Dx) для замкнутого однородного кубического B-сплайна. Я предполагаю простую кривую (несамопересекающиеся, все контрольные точки различны).
Я пытаюсь найти область, заключенную кривой:
Если я вычислил узловые точки (Px), я могу рассматривать кривую как многоугольник; то мне "просто" нужно найти оставшиеся области дельты для каждого сегмента, между фактической кривой и прямой, соединяющей узловые точки.
Я понимаю, что форма (и, следовательно, площадь) Bspline инвариантна относительно вращения и трансляции, поэтому для каждого сегмента я могу найти перевод, чтобы положить узел t = 0 в начало координат и поворот, чтобы положить t = 1 узел на оси + x:
Я могу найти уравнение для кривой, подключив точки и перегруппировав:
P(t) = (
(t**3)*(-Dm1 + 3*D0 - 3*D1 + D2)
+ (t**2)*(3*Dm1 - 6*D0 + 3*D1)
+ t*(-3*Dm1 + 3*D1)
+ (Dm1 + 4*D0 + D1)
) / 6.
но я отрываю свои волосы, пытаясь их интегрировать - я могу сделать
1
/
| Py(t) dt
/
t=0
но это не дает мне области. Я думаю, что мне нужно
Px(t=1)
/
| Py(t) (dPx(t) / dt) dt
/
x = Px(t=0)
но прежде, чем я пойду дальше, мне очень хотелось бы знать:
-
Является ли это правильным вычислением для области? В идеале, аналитическое решение сделает мой день!
-
Как только я нахожу эту область, как я могу определить, нужно ли добавлять или вычитать ее из базового поля (красные или зеленые области на первой диаграмме)?
-
Существуют ли какие-либо модули Python, которые будут делать это для меня? У Numpy есть несколько методов для оценки кубических Bsplines, но нет, которые, похоже, имеют дело с областью.
-
Есть ли более простой способ сделать это? Я думаю о том, чтобы оценить P (t) в кучу точек - что-то вроде
t = numpy.arange(0.0, 1.0, 0.05)
- и рассматривать все это как многоугольник. Любая идея, сколько подразделений необходимо для обеспечения заданного уровня точности (я бы хотел, чтобы ошибка была меньше 1%)?