前提・実現したいこと
引数として、始点(x,y),終点(x,y),中心点(x,y)と方向(時計回り/反時計回り)を受け取り、
円弧を描画するための角度を求めようとしております。
現在、内積を求めるところまでは出来たのですが、ここからどのようにして円弧の角度を求めてよいかがわかりません。
もし、ご存知の方がいらっしゃいましたらご教示ください。
該当のソースコード
C#
1/// <summary> 2/// 描画する円弧の角度を取得する 3/// </summary> 4/// <param name="spX">始点X</param> 5/// <param name="spY">始点Y</param> 6/// <param name="epX">終点X</param> 7/// <param name="epY">終点Y</param> 8/// <param name="cpX">中心点X</param> 9/// <param name="cpY">中心点Y</param> 10/// <param name="isClockwise">円弧の向きが時計回りの場合はtrue</param> 11/// <returns>算出した角度</returns> 12private double A(double spX, double spY, double epX, double epY, double cpX, double cpY, bool isClockwise) 13{ 14 double normSX = 0; // 中心点から始点に対するX座標のベクトル長 15 double normSY = 0; // 中心点から始点に対するY座標のベクトル長 16 double normEX = 0; // 中心点から終点に対するX座標のベクトル長 17 double normEY = 0; // 中心点から終点に対するY座標のベクトル長 18 19 double rootS = 0; 20 double rootE = 0; 21 double sqRoot = 0; 22 double numerator = 0; 23 double cos = 0; 24 double rad = 0; // 求めた内積のラジアン値 25 double angle = 0; // 求めた内積の角度 26 bool isReverse = false; //求めた内積角を反転させるか 27 28 // ベクトル長算出(中心点から始点) 29 normSX = spX - cpX; 30 normSY = spY - cpY; 31 // ベクトル長算出(中心点から終点) 32 normEX = epX - cpX; 33 normEY = epY - cpY; 34 // ベクトルの平方根を求める(=分母) 35 rootS = Math.Pow(normSX, 2) + Math.Pow(normSY, 2); 36 rootE = Math.Pow(normEX, 2) + Math.Pow(normEY, 2); 37 sqRoot = Math.Sqrt(rootS * rootE); 38 numerator = ( ( normSX * normEX ) + ( normSY * normEY ) ); 39 // コサインを求める 40 cos = ( numerator / sqRoot ); 41 // アークコサインを求める 42 rad = Math.Acos(cos); 43 // ラジアン値から角度を求める 44 angle = Math.Round((double)( rad * 180 / Math.PI )); 45 // 内積の角度を使用するか、外積の角度を使用するか判断する-S 46 // ここがわからない 47 // 内積の角度を使用するか、外積の角度を使用するか判断する-E 48 return angle; 49}
試したこと
始点と終点の大小関係などを考慮して判断処理を入れたりなどもしたのですが、
想定の結果を現在得られていません。
補足情報(FW/ツールのバージョンなど)
.net FW4.5
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/10 02:39
2020/05/10 03:17 編集