У меня есть список 2d точек, которые являются контрольными вершинами (Dx) замкнутого однородного кубического B-сплайна. Я предполагаю простую кривую (несамопересекающуюся, все контрольные точки различны).
Я пытаюсь найти площадь, ограниченную кривой:
Если я вычисляю узловые точки (Px), я могу рассматривать кривую как многоугольник; затем мне «просто» нужно найти оставшиеся области дельты для каждого сегмента между фактической кривой и прямой линией, соединяющей точки узлов.
Я понимаю, что форма (и, следовательно, площадь) B-сплайна не изменяется при вращении и перемещении, поэтому для каждого сегмента я могу найти перемещение, чтобы поместить узел 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%)?