質問
私は自分のフォーム上の2(VisualBasic.PowerPacks)線形状を持っています:
私はそのうちの一つ、特定のコンテキストメニューが表示されますをクリックします。線は、ユーザによって移動させることができます。コンテキストメニューがラインに関連付けられています。しかし、交点においてユーザがクリック場合(存在)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 + c1
とy2 = bx + c2
を持つ2つのラインを持っています。 x1=x2
とy1=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あなたの残りの問題を解決する必要がある場合、私はこれを信じています。