我正在WPF中编写一个应用程序并遇到了一个问题。如下图所示,我需要一种算法来确定指定的点P是否在圆的阴影区域内。阴影区域只是圆的一部分,具有方向(阴影区域在哪里看)和角度。
答案 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是否在饼图的开始和结束角度之间