扇形内部的点

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

最初,我想出了与答案类似的解决方案,但是我遇到了理解如何解决角度问题的困难,因为它们从0到360然后再绕回来。现在它已经有效运行了。 - Dave
2个回答

4

首先是数学部分:

令 v = p - c

令 u = (1,0) :使用上述几何关系

检查 |v| < r

角度 = acos(v.u/|v|)

检查角度是否在合理范围内。

在 WPF 中:

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

这是一个未经测试的类

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

0

假设您已经首先测试了P是否在圆内,并且您知道馅饼块的起始和结束角度

a. 找到线段CP(CPa)的方向 - 这应该是相当基本的三角函数

b. 检查CPa是否在馅饼块的起始和结束角度之间


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接