3차원에서 주어진 벡터 <a, b, c>가 있을때 벡터에 수직인 임의의 벡터를 구하는 것은 의외로 쉽지가 않습니다.
위 내용을 구현한 코드입니다.
정답이 없어 찾기가 어렵다기 보다는 무한의 값에서 하나를 선택하는 것이 어려운 문제입니다.
즉 <a, b, c>에 수직인 벡터의 수는 무한입니다.
벡터 V가 <a,b,c>와 수직일때 두 벡터의 내적은 0입니다.
a*V_x, +b*V_y+c*V_z=0
식은 하나인데 변수가 3개이기 때문에 위 식을 풀수가 없습니다.
그래서 2개의 변수를 고정하여 나머지 변수의 값을 구하도록 하겠습니다.
<a,b,c>에서 절대값이 가장 큰 항을 선택하고 나머지 값들을 각각 대응하는 벡터 V의 항에 대입합니다.
이렇게 되면 V의 나머지 항의 값을 계산할 수 있고 벡터 <a,b,c>에 수직인 벡터가 됩니다.
예를들어 c의 절대값이 가장 크다고 하면 수직인 벡터 V를 구할 수 있습니다.
\begin{array}\\a*a+b*b+c*V_z=0\\ V_z=-\frac{a*a+b*b}{c}\\V=<a,b,-\frac{a*a+b*b}{c}>\end{array}
double[] oDepthArr = new double[]{ oCablewayTurnFeature.EndLocation.X - oCablewayTurnFeature.StartLocation.X, oCablewayTurnFeature.EndLocation.Y - oCablewayTurnFeature.StartLocation.Y, oCablewayTurnFeature.EndLocation.Z - oCablewayTurnFeature.StartLocation.Z }; int index = 0; double? dMaxValue = null; for(int i = 0;i < oDepthArr.Length;i++) { if(!dMaxValue.HasValue || Math.Abs(oDepthArr[i]) > dMaxValue) { index = i; dMaxValue = Math.Abs(oDepthArr[i]); } } int j = (index + 1) % 3; int k = (index + 2) % 3; double V = -(oDepthArr[j] * oDepthArr[j] + oDepthArr[k] * oDepthArr[k])/oDepthArr[index]; double[] oWidthArr = new double[] { 0, 0, 0 }; oWidthArr[index] = V; oWidthArr[j] = oDepthArr[j]; oWidthArr[k] = oDepthArr[k];
댓글
댓글 쓰기