2016-12-09 13 views
0

私は円の中にある円(円、楕円、楕円)の2つの点p1とp2を持っています。 2つのポイントp3とp4を、どのようにして2つの点の間に正確に(すなわち等間隔に)置くことができますか?3Dで円上の2点間の点を見つけるにはどうすればよいですか?

私のアプローチは以下の通りです。与えられた例のように、私は期待される結果を得ている(p3 = [45.87,38.43,38.97]、p4 = [54.13、41.57、21.03])が、これは必ずしもそうではなく、標識/指示及び/又はp1及びp2が中心と一致するときに行う。私はまだ問題が何かを理解していない。 n1は計算に使用されません。 P1,2は正反対の、そしてあなたのv1,2が0に追加されたとき

import numpy as np 

p1 = np.array([42.96, 46.23, 33.42]) 
p2 = np.array([52.91, 32.21, 35.55]) 
center = np.array([50, 40, 30]) 
radius = 10 
n1 = np.array([0.64233475, 0.53814965, 0.54571148]) 

def FindIntermPtsOnCircle(p1, p2, center, radius): 

    # Calculate the direction vectors of the given points from the center 
    v1 = p1-center 
    v1 = v1/np.linalg.norm(v1) 
    v2 = p2-center 
    v2 = v2/np.linalg.norm(v2) 

    # Use bisecting line to find direction of the points of interest 
    va1 = v1+v2 
    va1 = va1/np.linalg.norm(va1) 
    va2 = -va1 

    # Multiply direction with radius to find relative distance and add to center 
    p3 = va1*radius + center 
    p4 = va2*radius + center 

    return p3, p4 

答えて

1

システムは、決定された下にあるので、あなたは、条件(チェックを使用することができます

あなたの方程式からの「二等分線」VA1はありませんクロスプロダクトv1,2 == 0またはちょうど| va1 + va2 | == 0)を使ってクロスプロダクトを使用して、そのケースの「パッチ」を生成するか、通常のクロスプロダクトを使用してサークル最初から飛行機を使用して条件式を必要としない式を作成する

def FindIntermPtsOnCircle(p1, p2, center, normalv): 

    # Calculate the vectors of the given points from the center 
    v1 = p1 - center 
    v2 = p2 - center 
    # Use bisecting line to find direction of the points of interest 
    # check for special case of v1,2 colinear, opposite sides, adding to Zero  
    va1 = v1 + v2 
    if np.vdot(va1, va1) == 0:  # if v1,2 colinear, opposite use 
     va1 = np.cross(normalv, v1) # norlmalv to calculate 
            # a "bisector" in circle plane 
    else: 
     va1 = va1 * (np.vdot(v1, v1)/np.vdot(va1, va1)**(1/2)) 

    # reverse direction of va1 to get other bisector: va2 
    va2 = -va1 

    # add to center 
    p3 = va1 + center 
    p4 = va2 + center 

    return p3, p4 
+0

ありがとうr!残念ながら、あなたのコードを試してみると、自分のコードと比較して得られたポイントが異なる結果になります。私はポイントを得るが、問題が何かを見てみるだろう。 – user56574

関連する問題