2017-07-24 65 views
0

我有一個平面定義爲xyz矢量和一個位於平面上的點。在三維空間中找到等距離的所有點位於預定義平面上的4個點

我想生成的xyz座標上在限定的距離/半徑(r)圍繞限定點(centroid)平面4點(N_points)。

我目前的解決方案只適用於2D。我想擴展這個在3D中工作,但我的幾何知識是讓我失望。任何想法將不勝感激。

def circlePoints(r, N_points, plane=(1,1,1), centroid=(0,0,0), rotation=0): 
    (plane_x, plane_y, plane_z) = plane 
    (centroid_x, centroid_y, centroid_z) = centroid 

    step = (np.pi*2)/N_points 
    rot=rotation 
    i=0 
    points=[] 
    for i in xrange(N_points): 
     x = round(centroid_x + ((np.sin(rot)*r)/plane_x), 2) 
     y = round(centroid_y + ((np.cos(rot)*r)/plane_y), 2) 
     z=0 #? 
     points.append((x,y,z)) 
     rot+=step 
    return points 

print circlePoints(1, 4, [1,2,0], [2,3,1]) 
print circlePoints(1, 4) 
+0

你爲什麼要(......)'? –

+0

,因爲我在默認情況下得到了一個很長的返回點'circlePoints(1,4)' – JoshuaBox

+0

你能告訴我更多關於你如何定義你的飛機嗎?你需要4個參數來指定一個3D平面,但你只有3. – Imran

回答

1

我們需要找到垂直plane(正常)載體。我們可以通過下面的步驟做:

  • 正常化plane
  • 設置一個載體k = (1, 0, 0)
  • 計算math.abs(np.dot(k, plane))
  • 如果> 0.9然後設置k = (0, 1, 0)
  • 計算a = np.cross(k, plane))b = np.cross(plane, a)
  • 現在在飛機上有兩個向量。您可以通過添加一些次數這兩個向量,並增加centeroid
  • 如果你想具體的距離獲得在平面上任意點,你需要正常化ab

代碼:

import numpy as np 
import math 

def normalize(a): 
    b = 1.0/math.sqrt(np.sum(a ** 2)) 
    return a * b 

def circlePoints(r, N_points, plane=(1,1,1), centroid=(0,0,0)): 
    p = normalize(np.array(plane)) 
    k = (1, 0, 0) 
    if math.fabs(np.dot(k, p)) > 0.9: 
     k = (0, 1, 0) 
    a = normalize(np.cross(k, p)) 
    b = normalize(np.cross(p, a)) 
    step = (np.pi * 2)/N_points 
    ang = [step * i for i in xrange(N_points)] 
    return [(np.array(centroid) + \ 
      r * (math.cos(rot) * a + math.sin(rot) * b)) \ 
      for rot in ang] 

print circlePoints(10, 5, (1, 1, 1), (0, 0, 0)) 
+0

這太棒了。謝謝!! – JoshuaBox

相關問題