3

3Dについて少し質問があります。

以下は私の問題の例です。

私には2つのポイントがあります:

A:12 4 5 B:6 8 -10

私は別のポイントがあります:C:5 6 7

角度ABCが48度になるように点Cを変換(?)する必要があります。

どうすればよいですか?誰かが式を手伝ってくれるか、あるいは上記の例を実用的なものにすることができれば幸いです。

別の言い方をすれば、角度ABCが48度になるように、Cx、Cy、およびCzを変換するにはどうすればよいですか?

私は今立ち往生しているので、これについていくつかの助けを本当にいただければ幸いです。

補足:角度を見つけるためのメソッドをすでに実装しています:

float Angle( float x1, float y1, float z1,
             float x2, float y2, float z2 )
{
  float x, y, z;
  CrossProduct( x1, y1, z1, x2, y2, z2, &x, &y, &z );

  float result = atan2 ( L2Norm( x, y, z ),
                         DotProduct( x1, y1, z1, x2, y2, z2 ) );

  return result;
}

あなたはそれを使用します:Angle(Bx-Ax、By-Ay、Bz-Az、Cx-Bx、Cy-By、Cz-Bz);

4

2 に答える 2

2
       A------C    
       |     
 c''   |    c'
       B

3Dの3点が平面を定義するため、その平面での変換C->c'またはC->c''の候補は2つだけです。

c'は、制約Normalize(c'-A)dot Normalize(BA)== cos(48/180 * pi)を使用してc' = A + t *(BA)+ u *(CA)になります。

最初にD=(BA)を正規化することをお勧めします。その後、次のようにします。

D dot D+u*(C-A) = 1 * |D+u(C-A)| * cos (48 degrees)

Dx*(Dx+u*(Cx-Ax))+ Dy*(Dy+u*(Cy-Ay))+Dz*(Dz+u*(Cz-Az)) ==
    0.669 * sqrt ((Dx+u*(Cx-Ax))^2+(Dy+u*(Cy-Ay))^2+(Dz+u*(Cz-Az))^2)

これはa+u * b == 0.669 * sqrt(c + du + e * u ^ 2)の形式であり、両側を2乗することでuの2次多項式に簡略化されます。

于 2013-01-23T05:11:52.860 に答える
0

ポイントCのトラックは実際には円錐であり、想像できます。Bは頂点であり、線ABは円錐の中心線であり、3D円錐がAB上で対称であることを意味します。

于 2013-01-23T04:52:08.100 に答える