在Pie Piece内部

时间:2011-11-25 00:10:13

标签: c# .net wpf algorithm math

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

Pie Piece

2 个答案:

答案 0 :(得分:4)

数学第一:

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

检查| v | < [R

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

答案 1 :(得分:0)

假设您第一次测试P在圆圈内,并且您知道饼图的起始角度和结束角度

一个。找到线段CP(CPa)的方向 - 这应该是相当基本的触发

湾检查CPa是否在饼图的开始和结束角度之间