饼内点

Dav*_*ave 3 .net c# algorithm math wpf

我正在 WPF 中编写应用程序并遇到问题。如下图所示,我需要一个算法来确定指定点 P 是否在圆的阴影区域内。阴影区域只是圆的一部分,具有方向(阴影区域所看到的位置)和角度。

馅饼片

Mat*_*lay 5

先数学:

let v = p - c let u = (1,0) :使用上面显示的几何图形

检查|v| <r

角度 = acos(vu/|v|)

检查角度是否在范围内。

在 WPF 中:

Vector v = p - (new Point(0,0));
if(v.Length > radius)
    return false;
double angle = -Vector.AngleBetween(v, new Vector(1,0));
...
Run Code Online (Sandbox Code Playgroud)

这是一个未经测试的类

class Pie
{
    public Point Center { get; set; }
    public double Radius { get; set; }
    public Vector ZeroDegrees { get; set; }
    public bool ClockwisePositive { get; set; }

    public double GetAngle(Point p)
    {
        if (ClockwisePositive)
            return (Vector.AngleBetween(p - Center, ZeroDegrees) + 360) % 360;
        else
            return (Vector.AngleBetween(ZeroDegrees, p - Center) + 360) % 360;
    }

    public bool Contains(Point p)
    {
        return (p - Center).Length <= Radius;
    }

    public class Slice
    {
        public Pie Parent { get; set; }
        public double DirectionDegrees { get; set; }
        public double SizeDegrees { get; set; }

        public bool Contains(Point p)
        {
            if (!Parent.Contains(p))
                return false;

            double angle = Parent.GetAngle(p);
            double minAngle = (DirectionDegrees - SizeDegrees / 2 + 360) % 360;
            double maxAngle = (DirectionDegrees + SizeDegrees / 2 + 360) % 360;

            if (minAngle < maxAngle)
                return minAngle <= angle && angle <= maxAngle;
            else
                return angle >= minAngle || angle <= maxAngle;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)