Это больше математики, чем программирование, так что вы можете проверить с людьми в math.stackexchange
. Но от ответа на ваш предыдущий вопрос, поверхность может быть параметризованных как:
s = p0 + u * (p1 - p0) + v * (p3 - p0) + u * v * (p2 - p3 - p1 + p0) =
p0 + u * a + v * b + u * v * c
с областью, ограниченной ваших четырех точек, отстоящих 0 <= u <= 1
и 0 <= v <= 1
.
Вы можете получить два вектора касательной к поверхности путем дифференцирования:
t1 = ds/du = a + v * c
t2 = ds/dv = b + u * c
И вы можете получить вектор, перпендикулярный к двум другим, с нормой, равной площади параллелограмма, описанного ими, принимая их декартово произведение:
A = t1 x t2 = a x b + u * a x c + v * c x b
заманчиво просто идти вперед и интегрировать, но это его норма вы хотите интегрировать, а не сам вектор. Я пробовал подавать это в Mathematica, чтобы узнать, придумает ли оно какое-нибудь хорошее закрытое решение, но это уже несколько минут, не прибывая нигде. Таким образом, вы можете также сделать вещи численно:
def integrate_hypar(p0, p1, p2, p3, n=100):
a = p1 - p0
b = p3 - p0
c = p2 - p3 - p1 + p0
delta = 1/n
u = np.linspace(0,1, num=n, endpoint=False) + delta/2
axb = np.cross(a, b)
axc = np.cross(a, c)
cxb = np.cross(c, b)
diff_areas = (axb + u[:, None, None] * axc +
u[:, None] * cxb) * delta * delta
diff_areas *= diff_areas
diff_areas = np.sum(diff_areas, axis=-1)
diff_areas = np.sqrt(diff_areas)
return np.sum(diff_areas)
С точки данных из другого вопроса, я получаю:
p0 = np.array([1.15, 0.62, -1.01])
p1 = np.array([1.74, 0.86, -0.88])
p2 = np.array([1.79, 0.40, -1.46])
p3 = np.array([0.91, 0.79, -1.84])
>>> integrate_hypar(p0, p1, p2, p3)
0.54825122958719719
Пытался что-нибудь до сих пор? – reptilicus
Эта поверхность, как представляется, описывается с использованием конечных элементов, поэтому вы должны рассчитать площадь для каждого из них и суммировать их ... –
@SaulloCastro извините, если изображение вводит в заблуждение. Сетка здесь видна только для визуализации поверхности. Поверхностный тип, с которым я имею дело, представляет собой двукратно управляемый гиперболический параболоид [link] (http://en.wikipedia.org/wiki/Doubly_ruled_surface) – Fnord