2015-01-20 4 views
0

저는 시작점과 끝점 (x, y, z)이있는 직선을 가지고 있으며이 벡터와 z=0에 의해 정의 된 평면 사이의 각도를 얻으려고합니다.3D 공간에서 직선의 각도를 결정하십시오.

enter image description here

그것은 각도로 설정 : 내가 여기

내 3D 환경에서 라인 (나는 빨간색 원으로 둘다 해요 라인)의 사진입니다 VB.NET

을 사용하고 있습니다 지금 70 도의.

+0

을 나는 사람이 보통 두 벡터 사이의 각도를 찾기 위해 십자가 제품을 사용하여 생각합니다. 아니면 Dot Product입니까? 나는 수학 SE 친구들이 확실히 알 수있는 내기를 걸 것이다. – Kevin

+0

* this *에 대한 답은 ** [this] (http://math.stackexchange.com/questions/463415/angle- 두 개의 3d 라인 사이) ** 질문? –

+0

이 문제를 해결하기위한 코드를 얻으려고합니다.NET) 그리고 동시에, 이것은 하나의 3D 환경에서 단 하나의 라인이 아니라 두 개의 @ Bjørn-RogerKringsjå – Joe

답변

5

2 rays to define an angle이 필요합니다.

벡터와 평면 사이의 각을 원하면 해당 평면의 벡터에 대해 정의됩니다. 그러나 벡터와 평면에 대한 투영 사이의 각은 최소값 하나만 있습니다.

따라서 최소값은 벡터와 평면 사이의 각도를 말할 때 취하는 값입니다.

이 값은 또한 벡터와 평면에 수직 인 벡터 사이의 각도입니다.이 값은 모두 on this site에 대해 자세히 읽을 수 있습니다. v 당신의 벡터 (따라서 v.x = end.x - start.x 및 IDEM yz), n 당신이 찾고있는 평면과 a 각도에 수직, 우리는 스칼라 제품의 정의에서 알 수와

그 :

<v,n> = ||v|| * ||n|| * cos(π/2 - a) 

우리는 cos(π/2 - a) = sin(a)을 알고 z=0 평면의 법선은 단순히 벡터 n = (0, 0, 1)입니다. 따라서 스칼라 곱 (v.x * n.x + v.y * n.y + v.z * n.z)과 n의 norm (||n|| = 1)을 많이 단순화 할 수 있습니다.

sin(a) = v.z/||v|| 

따라서 마지막으로, 사인의 reciprocical을 복용하고 v의 규범을 expliciting에 의해 공식 :

a = Asin(v.z/sqrt(v.x*v.x + v.y*v.y + v.z*v.z)) 

따르면이 this documentationAsin 기능은 사용자의 시스템에 존재하는 우리는 다음 식을 얻는다. 수학 수업.

반환 값 형식 : System.Double 이 각도가 θ, 라디안 등이 -π/2 ≤ θ ≤ π/2 - 또는 그것은, 그러나, 라디안 값을 반환 않습니다 - d< -1 또는 d> 1 또는 d가 NaN 인 경우 NaN입니다.

는 다행히 the same System.Math class contains the value of π 그래서 당신은 변환 할 수있는 :

a *= 180/Math.PI 
관련 문제