まず、2 つのベクトル間の角度を求める関数が必要になるでしょう。書き方は次のとおりです。
2 つのベクトルの外積の大きさは、ベクトルの大きさにベクトル間の角度のサインを掛けた積に等しくなります。
A = P1 からのベクトルとする --> P2; B = P2 からのベクトルとする --> P3; 角度をθとする
|A×B| = |A| |B| sin(θ) したがって、sin(θ) = ( |A × B| ) / (|A| |B| )
2 つの 2D ベクトルの外積の大きさは次のように計算されます: |A × B| = Ax By - Bx Ay
また、2 つのベクトルの内積の大きさは、ベクトルの大きさにベクトル間の角度の余弦を掛けた積に等しくなります。A·B = |A| |B| cos(θ) したがって cos(θ) = (A・B) / ( |A| |B| )
内積は次のように計算されます: A·B = Ax Bx + Ay By
|あ| = sqrt( Ax Ax + Ay Ay ) |B| = sqrt( Bx Bx + By By )
これにより、sin(θ) と cos(θ) が得られます。
atan2 を呼び出して、sin(θ) と cos(θ) から θ を取得できます。θ = atan2( sin(θ), cos(θ) )
今のコードで:
/// <summary>
/// Calculates the angle between two 2-D vectors.
/// </summary>
/// <returns>angle in radians</returns>
static double AngleBetweenVectors( double Ax, double Ay, double Bx, double By )
{
double magA = Math.Sqrt( Ax * Ax + Ay * Ay );
double magB = Math.Sqrt( Bx * Bx + By * By );
double magAmagB = magA * magB;
if( magA * magB == 0 ) throw new Exception( "Vectors must be non-zero length" );
double sinTheta = (Ax * By - Bx * Ay) / magAmagB;
double cosTheta = (Ax * Bx + Ay * By) / magAmagB;
double theta = Math.Atan2( sinTheta, cosTheta );
return theta;
}
結果はラジアンです。度を取得するには、180/Math.PI を掛けます。座標系が原因で時計回りと反時計回りが逆になっていることがわかった場合は、結果のマイナスを取ってください。
円弧描画関数は x 軸を基準点として使用するため、ベクトルと x 軸 (1,0) の間の角度を見つける必要があります。開始角度と終了角度を指定する必要があります。円弧が目的の方向に進んでいることを確認するための条件付きチェックが少し必要になる可能性が高く、必要に応じて thetaStart > thetaEnd または thetaStart < thetaEnd のように角度を調整できます。
あなたも このリンクをチェックしたいでしょう