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];
댓글
댓글 쓰기