我正在使用WPF编写一个应用程序,并遇到了一个问题。如下图所示,我需要一个算法来确定指定点P是否在圆的阴影区域内。阴影区域只是具有方向(阴影区域朝向哪里)和角度的圆的一部分。
首先是数学部分:
令 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;
}
}
}
假设您已经首先测试了P是否在圆内,并且您知道馅饼块的起始和结束角度
a. 找到线段CP(CPa)的方向 - 这应该是相当基本的三角函数
b. 检查CPa是否在馅饼块的起始和结束角度之间