Точка внутри пирога - PullRequest
       0

Точка внутри пирога

3 голосов
/ 25 ноября 2011

Я пишу заявку в WPF и столкнулся с проблемой.Как видно на рисунке ниже, мне нужен алгоритм, который определяет, находится ли указанная точка P внутри затененной области круга.Затененная область - это просто часть круга, которая имеет ориентацию (на которую смотрит затененная область) и угол.

Pie Piece

Ответы [ 2 ]

4 голосов
/ 25 ноября 2011

Сначала математика:

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;
        }
    }
}
0 голосов
/ 25 ноября 2011

при условии, что вы сначала проверили, что P находится внутри круга, и что вы знаете начальный и конечный углы для части пирога

а. найти Ориентацию отрезка линии CP (CPa) - это должен быть довольно простой триг

б. проверьте, находится ли CPa между начальным и конечным углами для части пирога

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...