Hypar的表面积(双曲抛物面)

时间:2013-09-19 19:07:18

标签: python math numpy 3d

我已经发布了有关此主题的问题: Speeding up a closest point on a hyperbolic paraboloid algorithm

给定定义doubly ruled hyperbolic paraboloid的四个点(p0,p1,p2,p3),使用python&numpy模块计算其表面积的最佳(最快)方法是什么?

1 个答案:

答案 0 :(得分:3)

这是比编程更多的数学,所以你可能想与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 <= 10 <= 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

简单地继续整合A很诱人,但这是你想要整合的标准,而不是矢量本身。我已经尝试过将它喂给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