/// <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); }
/// <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); } } }