Сначала математика:
let v = p - c let u = (1,0): Использование геометрии, показанной выше
Check | v |
Угол = 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));
...
Вотнепроверенный класс
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;
}
}
}