3

短縮版:

基本的に、 ( )Point Cの終点を使用して未知数の X 値と Y 値を計算しようとしています。Line ABPoint B

使用してみatan2( B.y, B.x)ましたが、 に対応する角度が得られ、X-Axis座標が間違っています。Line BCによって形成される角度と、その上にある仮想の水平軸Point B( )を取得する必要があると考えましたAngle P。その角度を取得する方法はありますか?その角度を取得しても、やりたいことを実行できないとしたら、どうしますか?

長いバージョン:

C++ を使用して数学を実行しようとしていますが、この特定の問題に行き詰まりました。

2 つのベクトルVector AVector B( と で示されPoint APoint Bそれらは を形成しますline AB) があります。ここで、 ( で示される)から離れた単位であるVector C( Point C)を取得したいと思います。LVector BLine BC

ケース 1: By > Ay の場合はポイントを獲得

私は周りを検索し、いくつかの本を読み、必要なポイントを得るためにこの公式を得ました.

/* Let:
 * L = length from B to C
 * ( B.x, B.y ) = start point
 * ( C.x, C.y ) = end point 
 * theta = angle respective to X-Axis ( using atan2( B.y, B.x ) )
 */

// To get C.x use formula cos( theta ) = ( C.x - B.x ) / L then derive
C.x = ( L * cos( theta ) ) + B.x;

// To get C.y use formula sin( theta ) = ( C.y - B.y ) / L then derive
C.y = ( L * sin( theta ) ) + B.y;

ただし、結果は に対応するPoint Cため、上記のようにはなりません。もう少し読んだ後、 (淡い赤の線) と仮想の水平軸 (青緑の線)の間の角度 (紫で示されている) を取得する必要があることがわかりました。CX-AxisAngle PLine BCPoint B

もう一つの例:

ケース 2: By < Ay の場合はポイントを獲得

この場合、上記の式を使用するCと、間違った場所に配置されます (上記( X , 5 )) 。

getAngle Pで私が望むことができるかどうかはわかりませんが、もっと適切な答えを知っている場合は、そうしてください。

4

3 に答える 3

4

これにはトリガーは必要ありません。シンプルな比率です。私が見つけた便利なルールは、sin、cos 、およびatan2を使用していることに気付いた場合、おそらく間違っているということです。

トリグなしでそれを行う方法は次のとおりです

dx = B.x - A.x;
dy = B.y - A.y;
dist = sqrt(dx*dx + dy*dy);
C.x = B.x + L*(dx/dist);
C.y = B.y + L*(dy/dist);
于 2012-09-15T06:44:35.393 に答える
3

最初に行うことは、あたかも A が原点であるかのように tempB を作成することです (したがって、B から A への角度などを見つけることができます)。

B から A の値を引きます。

tempB.x = B.x - A.x
tempB.y = B.y - A.y

次に、atan2 を sin/cos (数式) と共に使用して、Cx と Cy を取得できます。

theta = atan2(tempB.y, tempB.x)
C.x = ( L * cos( theta ) ) + B.x;
C.y = ( L * sin( theta ) ) + B.y;

もう 1 つの方法は、tempB の単位ベクトルを取得することです。

magnitude = sqrt( pow(tempB.x,2) + pow(tempB.y,2))
unit.x = tempB.x/magnitude
unit.y = tempB.y/magnitude

この単位ベクトルに L を掛けると、B からのオフセットが得られます。

C.x = B.x + unit.x * L
C.y = B.y + unit.y * L
于 2012-09-15T05:51:24.087 に答える
1

必要なのは (ベクトル用語で) ですC = B + L*normalize(B-A)。この種の計算をさらに多く行う場合は、ベクトル ライブラリを使用して、そのようにコードを正確に記述できるようにすることをお勧めします。それ以外の場合は、同じ計算を基本的なステップに分解するジョンの答えを使用する必要があります。

編集:これは非常に簡単に使用できるライブラリです(これは単なるヘッダーファイルです):GLM

于 2012-09-15T07:33:22.940 に答える