*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

<C#>
ベクトルで位置を示すマーク(円形の図画)を回転させるサンプル

 --- 回転角度を絶対角度で指定する場合

のコード No.4


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

.






元のページ


元ページ「<C# > ベクトルで位置を示すマーク(円形の図画)を回転させるサンプル

 --- 回転角度を絶対角度で指定する場合」
http://note.chiebukuro.yahoo.co.jp/detail/n337497

記述量上限の制限で、ページを分けて記述しています。







本ページの前のページ


「ベクトルで位置を示すマーク(円形の図画)を回転させるサンプル

 --- 回転角度を絶対角度で指定する場合」のコード No.3
http://note.chiebukuro.yahoo.co.jp/detail/n337719

記述量上限の制限で、ページを分けて記述しています。









はじめに


元ページの

「<C#> ベクトルで位置を示すマーク(円形の図画)を回転させるサンプル

 --- 回転角度を絶対角度で指定する場合」

におけるコードをここに記述します。








角度計算基本処理クラスのソースコード





using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;



// ベクトルで位置を示すマーク(円形の図画)を回転させるサンプル

//  --- 回転角度を絶対角度で指定する場合

namespace DesignateRotationByUsingVectorInAbsoluteAngle

{


    //========================

    // 角度計算基本処理クラス

    // ------------------------

    // 角度に関する計算を行なうクラスです。また、極座標系(角度

    // を取り扱いやすい座標系)とxy座標系との変換も行ないます。

    //========================

    public class BasicAngleProcessing

    {



        //=o=o=o=o=o=o=o=o=o=o=

        //=====================

        // 回転位置取得メソッド(絶対角度指定)

        // 第1引数: 現在位置のベクトル

        // 第2引数: 回転の中心位置のベクトル

        // 第3引数: 回転させる角度 <単位は、ラジアン>

        //            --- 中心点から水平に右側に移動した位置を、

        //                零度(基準)と定めた角度で指定。

        // 第4引数: 回転後の位置ベクトルを出力

        //=====================

        //=o=o=o=o=o=o=o=o=o=o=

        public static void RotatePositionAtAbsoluteAngle(

            XYCoordinatesVector Present_Position,

            XYCoordinatesVector Center_Point,

            float Rotation_Angle,

            ref XYCoordinatesVector After_XYVector)

        {

            // 中心位置から対象点現在位置まで引いたベクトル

            XYCoordinatesVector dV = new XYCoordinatesVector();



            // 方位ベクトル

            // 中心から現在位置までの距離

            // 及び

            // 中心から現在位置までの角度

            // を示すベクトルです。

            PolarCoordinatesVector Direction_PVector = new PolarCoordinatesVector();



            // 中心位置から対象点現在位置まで引いたベクトルを取得

            dV = Present_Position - Center_Point;



            // x,y座標による成分を、大きさと角度による成分に変換

            ConvertFromXYToSizeAngle(dV, ref Direction_PVector);



            // 回転

            //  --- 回転角度を絶対角度で指定

            Direction_PVector.angle = Rotation_Angle;



            // 回転後の方位ベクトル(極座標ベクトルクラス)をxy座標ベクトルクラスに変換

            ConvertFromSizeAngleToXY(Direction_PVector, ref After_XYVector);



            // 回転後の対象点の位置ベクトルを取得

            //  --- 方位ベクトルをxy座標ベクトルクラスに変換したものと、

            //      中心点位置ベクトルとを加算

            After_XYVector = Center_Point + After_XYVector;


        }



        //=o=o=o=o=o=o=o=o=o=o=

        //=====================

        // 回転位置取得メソッド(相対角度指定)

        // 第1引数: 現在位置のベクトル

        // 第2引数: 回転の中心位置のベクトル

        // 第3引数: 回転させる角度(増分) <単位は、ラジアン>

        // 第4引数: 回転後の位置ベクトルを出力

        //=====================

        //=o=o=o=o=o=o=o=o=o=o=

        public static void RotatePositionAtDesignatedAngle(

            XYCoordinatesVector Present_Position,

            XYCoordinatesVector Center_Point,

            float Step_Angle,

            ref XYCoordinatesVector After_XYVector)

        {

            //------------

            // 中心から現在位置までの距離を算出

            //------------



            // 方位ベクトル

            // 中心から現在位置までの距離

            // 及び

            // 中心から現在位置までの角度

            // を示すベクトルです。

            PolarCoordinatesVector Direction_PVector = new PolarCoordinatesVector();



            // 中心位置から対象点現在位置まで引いたベクトルを取得

            XYCoordinatesVector dV = Present_Position - Center_Point;



            // x,y座標による成分を、大きさと角度による成分に変換

            ConvertFromXYToSizeAngle(

                dV,

                ref Direction_PVector);



            //------------

            // 回転角度(増分)だけ回転させた角度を算出

            //------------




            // 回転

            //  --- 回転角度を相対角度で指定

            Direction_PVector.angle = Direction_PVector.angle + Step_Angle;



            //------------

            // 指定角度の位置を算出

            //------------



            // 回転後の方位ベクトル(極座標ベクトルクラス)をxy座標ベクトルクラスに変換

            ConvertFromSizeAngleToXY(Direction_PVector, ref After_XYVector);



            // 回転後の対象点の位置ベクトルを取得

            //  --- 方位ベクトルをxy座標ベクトルクラスに変換したものと、

            //      中心点位置ベクトルとを加算

            After_XYVector = Center_Point + After_XYVector;


        }



        //===================

        // 極座標系(大きさと角度で表現する座標系)からx,y座標値に変換するメソッド。

        // 第1引数: 極座標ベクトルクラスを入力

        // 第2引数: xy座標ベクトルクラスを出力

        public static void ConvertFromSizeAngleToXY(

            PolarCoordinatesVector Size_Angle,

            ref XYCoordinatesVector XY_Data)

        {

            XY_Data.x = Size_Angle.size * (float)Math.Cos(Size_Angle.angle);

            XY_Data.y = Size_Angle.size * (float)Math.Sin(Size_Angle.angle);

        }





        //===================

        // x,y座標値から極座標系(大きさと角度で表現する座標系)に変換するメソッド。

        // 第1引数: xy座標ベクトルクラスを入力

        // 第2引数: 極座標ベクトルクラスを出力

        public static void ConvertFromXYToSizeAngle(

            XYCoordinatesVector XY_Data,

            ref PolarCoordinatesVector Size_Angle)

        {


            //------------

            // ベクトルの大きさをピタゴラスの定理から取得

            //------------



            Size_Angle.size = (float)Math.Sqrt(XY_Data.x * XY_Data.x + XY_Data.y * XY_Data.y);



            //------------

            // ベクトルの方向(角度)をatan()関数から取得

            //------------



            Size_Angle.angle = (float)Math.Atan((double)XY_Data.y / (double)XY_Data.x);



            // 0 から 2PI の範囲に整える

            AdjustAngleFromZeroToTwoPI(ref Size_Angle.angle);



            //------------

            // atan()関数で角度取得をした場合、

            // 本来 0.5PI から PI の範囲が、1.5PI から 2PI になってしまう。

            // 同じく、

            // 本来 PI から 1.5PI の範囲が、0 から 0.5PI になってしまう。

            // それを以下で修正する。

            //------------



            // 本来 0.5PI から PI の範囲が、1.5PI から 2PI になっている場合

            if ((XY_Data.x < 0 && XY_Data.y >= 0.0F) && (Size_Angle.angle > 1.4 * Math.PI))

            {

                Size_Angle.angle = (float)((double)Size_Angle.angle - Math.PI);

            }

            // 本来 PI が、0 になっている場合

            else if ((XY_Data.x < 0.0F && XY_Data.y >= 0.0F) && (Size_Angle.angle == 0.0F))

            {

                Size_Angle.angle = (float)Math.PI;

            }

            // 本来 PI から 1.5PI の範囲が、0 から 0.5PI になっている場合

            else if ((XY_Data.x < 0.0F && XY_Data.y < 0.0F) && (Size_Angle.angle < 0.6 * Math.PI))

            {

                Size_Angle.angle = (float)((double)Size_Angle.angle + Math.PI);

            }

            else

            {

                // 修正不要にて未処理

            }


        }




        //========================

        // 角度調整

        //  指定角度を0から2PIの範囲に整理する。

        //  例えば、2.5PIは、0.5PI とする。

        //  また、-0.5PI ならば、1.5PI とする。

        // 第1引数: 対象の角度を入力し、調整結果が出力。

        // 戻り値: 回転数

        // 例

        //  5.3PI  ---> 第1引数: 1.3PI、戻り値: 2

        //  -5.2PI ---> 第1引数: 0.8PI、戻り値: -2

        //========================

        public static int AdjustAngleFromZeroToTwoPI(ref float Angle_Data)

        {

            double AngleWork;   // 角度(double変換値)

            int RotationNum = 0;    // 回転数



            // 正負判定

            bool PlusFlg;

            if (Angle_Data < 0.0)

            {

                PlusFlg = false;

                AngleWork = -Angle_Data;

            }

            else

            {

                PlusFlg = true;

                AngleWork = Angle_Data;

            }


            if (AngleWork >= 2.0 * Math.PI)

            {

                AngleWork = AngleWork / Math.PI;

                while (AngleWork >= 2.0)

                {

                    AngleWork = AngleWork - 2.0;    // 角度調整

                    RotationNum++;  // 回転数加算

                }


                AngleWork = AngleWork * Math.PI;

            }



            // 負時における修正

            if (PlusFlg == false)

            {

                AngleWork = 2.0 * Math.PI - AngleWork;

                RotationNum = -1 * RotationNum;

            }



            // 出力用引数に、算出結果を設定

            Angle_Data = (float)AngleWork;



            return RotationNum;

        }




    }

}





さいごに


本ページの内容説明については、元ページを参照して下さい。