У меня есть список 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 есть несколько методов для вычисления кубических B-сплайнов, но ни один из них, похоже, не имеет отношения к площади.
Есть ли более простой способ сделать это? Я думаю о том, чтобы, возможно, оценить P (t) в нескольких точках - что-то вроде
t = numpy.arange(0.0, 1.0, 0.05)
- и рассматривать все это как многоугольник. Есть идеи, сколько подразделений необходимо, чтобы гарантировать заданный уровень точности (я бы хотел погрешность <1%)?