質問

私は自分のフォーム上の2(VisualBasic.PowerPacks)線形状を持っています:

ALTテキストhttp://lh4.ggpht.com /_1TPOP7DzY1E/S2cIJan7eHI/AAAAAAAADAw/qwA0jFHEbBM/s800/intersection.pngする

私はそのうちの一つ、特定のコンテキストメニューが表示されますをクリックします。線は、ユーザによって移動させることができます。コンテキストメニューがラインに関連付けられています。しかし、交点においてユーザがクリック場合(存在)Iアクションを実行するために交差線のいずれかを選択する他のメニューを表示する必要があります。

さて、私は他のコンテキスト・メニューは、この場合に表示されますので、2(またはそれ以上)の線は、クリックポイントで交差していることを検出する方法を疑問に思う。

私が実行しようとしました何ます:

    private void shapeContainer1_MouseDown(object sender, MouseEventArgs e)
    {
        // right click only
        if (e.Button == MouseButtons.Right)
        {
            LineShape target = 
                (shapeContainer1.GetChildAtPoint(e.Location) as LineShape);

            if (target != null)
            {
                Console.WriteLine(new Point(target.X1, target.Y1));
            }

        }
    }

私はコンテナにのみ線形状を持っていると仮定します。これは、任意の線形は、マウスの下になる場合ShapeContainerは、MouseDownイベントは発生しません、と語りました。

しかし、このコードは私だけmostTopラインを与えるが、私はあまりにも他の人のリストが欲しいます。

役に立ちましたか?

解決 5

    /// obtains a list of shapes from a click point
    private List<LineShape> GetLinesFromAPoint(Point p) 
    {
        List<LineShape> result = new List<LineShape>();
        Point pt = shapeContainer1.PointToScreen(p);

        foreach (Shape item in shapeContainer1.Shapes)
        {
            LineShape line = (item as LineShape);
            if (line != null && line.HitTest(pt.X, pt.Y))
            {
                result.Add(line);                    
            }
        }
        return result;
    }

    private void shapeContainer1_MouseDown(object sender, MouseEventArgs e)
    {
        // right click only
        if (e.Button == MouseButtons.Right)
        {
            List<LineShape> shapesList = GetLinesFromAPoint(e.Location);
            Console.WriteLine(DateTime.Now);
            Console.WriteLine("At this point {0} there are {1} lines.", 
                e.Location, shapesList.Count);
        }
    }

他のヒント

あなたの座標のネットワークでは、y1 = ax + c1y2 = bx + c2を持つ2つのラインを持っています。 x1=x2y1=y2
交点を探します y = ax + c1, y = bx + c2
ax + c1 = bx + c2
x = (c2 - c1)/(a - b)
次に、交点がライン境界と計算近接+を超えていないことを確認 - ピクセルまたは2つの

あなただけの2本の線分の交点を計算する必要があります。これは非常に簡単です。

フル、作業アルゴリズムはのここに記載されています。これは、2つの点で定義された線分オフ動作しますので、あなたの状況に適応するために簡単なはずです。

serhio、thatsの簡単な数学に...

その後、

あなたの線の交点うち仕事(おそらくそれらが追加されたとき、これを行うと、店の結果)、マウスがコンテキストメニューを表示するwarrentに近い十分にある場合は、ピクセルパーフェクトのクリックを必要としないので、参照してください。

は別にライン交差アルゴリズム(このページにはいくつかの人々によって示されるように)から、あなたがラインからコンテキストメニューを分離する必要があります。擬似コードでは、あなたのような何かをする必要があります:

onLine1Click:
if intersection then handle intersection
else handle line1 click

onLine2Click:
if intersection then handle intersection
else handle line2 click

この処理は、コンテキストメニューを表示することができます。 IF / THEN / ELSEあなたの残りの問題を解決する必要がある場合、私はこれを信じています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top