нахождение площади замкнутого 2d однородного кубического B-сплайна

У меня есть список 2d точек, которые являются контрольными вершинами (Dx) замкнутого однородного кубического B-сплайна. Я предполагаю простую кривую (несамопересекающуюся, все контрольные точки различны).

Я пытаюсь найти площадь, ограниченную кривой:

enter image description here

Если я вычисляю узловые точки (Px), я могу рассматривать кривую как многоугольник; затем мне «просто» нужно найти оставшиеся области дельты для каждого сегмента между фактической кривой и прямой линией, соединяющей точки узлов.

Я понимаю, что форма (и, следовательно, площадь) B-сплайна не изменяется при вращении и перемещении, поэтому для каждого сегмента я могу найти перемещение, чтобы поместить узел t=0 в начало координат, и вращение, чтобы поместить t =1 узел на оси +x:

enter image description here

Я могу найти уравнение для кривой, подставив точки и перегруппировав:

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)

, но прежде чем идти дальше, я действительно хотел бы знать:

  1. Это правильное вычисление площади? В идеале аналитическое решение сделало бы мой день!

  2. Как только я найду эту область, как мне определить, нужно ли мне добавить или вычесть ее из базового полигона (красные и зеленые области на первой диаграмме)?

  3. Существуют ли какие-либо модули Python, которые могли бы сделать этот расчет за меня? У Numpy есть несколько методов для оценки кубических B-сплайнов, но ни один из них не имеет отношения к площади.

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

14
задан Hugh Bothwell 3 June 2012 в 02:23
поделиться