2016-04-24 5 views
0

与えられた平面方程式は、どのように四角形を構成する4つの点を生成できますか?私は平面方程式ax + by + cz = dしか持たない。平面方程式から矩形を生成する方法ax + by + cz = d?

私はここFind Corners of Rectangle, Given Plane equation, height and width

#generate horizontal vector U 
     temp_normal=np.array([a,b,c]) 

     temp_vertical=np.array([0,0,1]) 

     U=np.cross(temp_normal, temp_vertical) 

     # for corner 3 and 4 
     neg_U=np.multiply([-1.0, -1.0, -1.0], U) 
#generate vertical vector W  


     W=np.cross(temp_normal,U) 
     #for corner 2 and 4 
     neg_W=np.multiply([-1.0, -1.0, -1.0], W) 




     #make the four corners 
     #C1 = P0 + (width/2) * U + (height/2) * W 
     C1=np.sum([centroid,np.multiply(U, width_array),np.multiply(W, height_array)], axis=0) 

     corner1=C1.tolist() 


     #C2 = P0 + (width/2) * U - (height/2) * W 
     C2=np.sum([centroid,np.multiply(U, width_array),np.multiply(neg_W, height_array)], axis=0) 

     corner2=C2.tolist() 


     #C3 = P0 - (width/2) * U + (height/2) * W 
     C3=np.sum([centroid,np.multiply(neg_U, width_array),np.multiply(W, height_array)], axis=0) 

     corner3=C3.tolist() 


     #C4 = P0 - (width/2) * U - (height/2) * W 
     C4=np.sum([centroid,np.multiply(neg_U, width_array),np.multiply(neg_W, height_array)], axis=0) 
     self.theLw.WriteLine("C4 is " +str(type(C4))+" "+str(C4.tolist())) 
     corner4=C4.tolist() 


     corners_list.append([corner1, corner2, corner3, corner4]) 

答えて

1

式を使用して、その平面内のベクトルを探す記載されたアプローチを以下しています。 cross-product(最初のものとnormal vector to the plane)を使用して、最初のものに垂直な、その面内の2番目のものを探します。 4つのコーナーを生成するためにこれらのベクトルを追加します(+記号、4つの可能性あり)。

編集:もう少しあなたを助けるために:

  • (a、b、c)は、平面の法線ベクトルです。 (0、d/b、0)および(d/a、0,0)は、平面に属する点、すなわち、例えばb1 =(0、d/b)である。 、-d/c)は、平面に接するベクトルです。
  • 2つのベクトルの外積は、両方に垂直なベクトルを返します。従って、積b2 =(a、b、c)x(0、d/b、-d/c)は平面に接するベクトルであり、他方に対して垂直である。これで、あなたは平面[b1、b2]の通常の基礎を構築しました。

  • ポイントから開始して、(0,0、d/c)とし、4つのコーナーを持つようにb1 + b2、b1-b2、-b1 + b2、-b1-b2を追加します。ここで[OK]を

答えです:

import numpy as np 

a = 2; b = 3; c = 4; d = 5 
n = np.array([a,b,c]) 
x1 = np.array([0,0,d/c]) 
x2 = np.array([0,d/b,0]) 

def is_equal(n,m): 
    return n-m < 1e-10 

def is_on_the_plane(v): 
    return is_equal(v[0]*a + v[1]*b + v[2]*c, d) 

assert is_on_the_plane(x1) 
assert is_on_the_plane(x2) 

# Get the normal basis 
b1 = x2 - x1 
b2 = np.cross(n, b1) 

c1 = x1 + b1 + b2 
c2 = x1 + b1 - b2 
c3 = x1 - b1 + b2 
c4 = x1 - b1 - b2 

assert is_on_the_plane(c1) 
assert is_on_the_plane(c2) 
assert is_on_the_plane(c3) 
assert is_on_the_plane(c4) 

assert is_equal(np.dot(c1-c3, c1-x2), 0) 
assert is_equal(np.dot(c2-c1, c2-c4), 0) 
# etc. : 

# c3  c1 
# 
#  x1 
# 
# c4  c2 

それは実際には正方形であるが、あなたはそれより少なく、特定の長方形にする方法を確実に見つけることができます。

+0

私が正しく飛行機の中にベクトルUを見つけたとすれば、 V = np.cross(U、N)ここでN = np.array([a、b、c])を見つけると、コーナー= np.add(+/- V、+/- U)の4つのコーナーを見つける – webmaker

+0

そのようなベクトルを定義する平面の方程式を検証する座標(x、y、z)の点 – JulienD

+0

任意の点を差し込むだけではなく、最初のベクトルを平面内で見つける方法はありますか? – webmaker

関連する問題