3

このトピックに関するこの質問を既に投稿しまし た: 双曲放物面アルゴリズムで最も近い点を高速化する

4 つの点 (p0、p1、p2、p3) が与えられて二重支配双曲放物面を定義する場合、python の numpy モジュールを使用してその表面積を計算する最良の (最速の) 方法は何ですか?

4

1 に答える 1

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

あなたの4つのポイントによって制限された領域は0 <= u <= 10 <= v <= 1です。

微分により、サーフェスに接する 2 つのベクトルを取得できます。

t1 = ds/du = a + v * c
t2 = ds/dv = b + u * c

そして、それらの外積をとって、それらによって記述される平行四辺形の面積に等しいノルムを持つ、他の 2 つに垂直なベクトルを取得できます。

A = t1 x t2 = a x b + u * a x c + v * c x b

単純に A を統合したくなるかもしれませんが、統合したいのはベクトルそのものではなく、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
于 2013-09-19T20:54:57.640 に答える