Ejemplo n.º 1
0
        /// <summary>centerを中心に、aからbに何度回転しているか求める</summary>
        public static double GetAngle(PointD center, PointD a, PointD b)
        {
            var vectorA = a.Clone();

            vectorA.MinusEqual(center);
            var vectorB = b.Clone();

            vectorB.MinusEqual(center);

            var lengthA      = Calc.GetDistance(a, center);
            var lengthB      = Calc.GetDistance(b, center);
            var innerProduct = Calc.GetInnerProduct(vectorA, vectorB);
            var outerProduct = Calc.GetOuterProduct(vectorA, vectorB);

            double cosTheta = innerProduct / (lengthA * lengthB);

            if (1 < Math.Abs(cosTheta))
            {
                cosTheta = Math.Sign(cosTheta);
            }

            double theta = Math.Acos(cosTheta);

            var angle = theta * (180 / Math.PI);

            //このままだと回転方向が分からず0~180°で値が返ってくるので、
            //0~360°になるように調整する。
            if (Math.Sign(outerProduct) < 0)
            {
                angle = 360 - angle;
            }

            return(angle);
        }
Ejemplo n.º 2
0
        /// <summary>basePointから見てpointがどっち方向にあるか、おおざっぱに上下左右で判定する</summary>
        public static Direction GetDirectionOozappa(PointD basePoint, PointD point)
        {
            var sa = point.Clone();

            sa.MinusEqual(basePoint);

            var absX = Math.Abs(sa.X);
            var absY = Math.Abs(sa.Y);

            if (absY < absX)
            {
                if (0 < sa.X)
                {
                    return(Direction.Right);
                }
                else
                {
                    return(Direction.Left);
                }
            }
            else
            {
                if (0 < sa.Y)
                {
                    return(Direction.Up);
                }
                else
                {
                    return(Direction.Down);
                }
            }
        }