パイの中のポイント

私はWPFでアプリケーションを書いていますが、問題が発生しました。下の図に示すように、指定された点Pが円の影付き領域の内側にあるかどうかを決定するアルゴリズムが必要です。陰影付き領域は、方向(陰影付き領域が見えている)および角度を有する円の一部分に過ぎない。

Pie Piece

3
当初は回答と同様の解決策を思いつきましたが、角度が0から360に変わってからラップアラウンドするので、角度を解決する方法を理解するのに問題がありました。それは今働いている。
追加された 著者 Dave,

2 答え

数学は最初に:

v = p-cとする。   let u =(1,0):上記のジオメトリを使用する

Check |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;
        }
    }
}
4
追加された
非常にエレガントなソリューションは、ありがとう!
追加された 著者 Dave,

最初にPが円の内側にあることをテストしたと仮定し、パイの部分の開始角度と終了角度を知っていると仮定します

a。線分CP(CPa)のオリエンテーションを見つける - これはかなり基本的な三角です

b。 CPaが円の開始角度と終了角度の間にあるかどうかを確認する

0
追加された