アンカーを使用せずに、線で2つのWPFのcanvas要素を接続しますか?
-
20-09-2019 - |
質問
私は作図のためのキャンバスを有し、有向線(矢印終了)によって図中のノードに参加したいです。 私はラインが唯一のノード上の特定のポイントで取り付けてそれが私のために動作しませんでしたアンカーアプローチを試みたが、それはがらくたのように見えます。
Iは、単に他の各オブジェクトの中心から線を望んで、矢印端部が適切に表示するために、ノードのエッジのラインを止めます。しかしに対して交差をテストするためのcanvas要素のエッジを見つけることは困難であることが分かっている。
任意のアイデア?
解決
私は、要素のバウンディングボックスを使用して作業する方法を得ました。私の要素が完全な矩形ではありませんので、それは、完璧ではないが、それはOKに見えます。
基本的に私は、キャンバス内の要素のバウンディングボックスがで座標を見つけます
private static Rect GetBounds(FrameworkElement element, UIElement visual)
{
return new Rect(
element.TranslatePoint(new Point(0, 0), visual),
element.TranslatePoint(new Point(element.ActualWidth, element.ActualHeight), visual));
}
次に、Iはバウンディングボックスの四辺のそれぞれに対する中心線との交点を見つけ、線形状によって、2つの要素を接続するために、その交点を使用します。
私は、サードパーティ忍者交差点コードが見つかりました: http://thirdpartyninjas.com/blog/2008/10/07 /線分交差/ の
private void ProcessIntersection()
{
float ua = (point4.X - point3.X) * (point1.Y - point3.Y) - (point4.Y - point3.Y) * (point1.X - point3.X);
float ub = (point2.X - point1.X) * (point1.Y - point3.Y) - (point2.Y - point1.Y) * (point1.X - point3.X);
float denominator = (point4.Y - point3.Y) * (point2.X - point1.X) - (point4.X - point3.X) * (point2.Y - point1.Y);
intersection = coincident = false;
if (Math.Abs(denominator) <= 0.00001f)
{
if (Math.Abs(ua) <= 0.00001f && Math.Abs(ub) <= 0.00001f)
{
intersection = coincident = true;
intersectionPoint = (point1 + point2) / 2;
}
}
else
{
ua /= denominator;
ub /= denominator;
if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1)
{
intersection = true;
intersectionPoint.X = point1.X + ua * (point2.X - point1.X);
intersectionPoint.Y = point1.Y + ua * (point2.Y - point1.Y);
}
}
}
出来上がり!線は、それらが他の各ノードの中心から行くかのように描かれて今が、矢印の端が見えるように、ノードのエッジにほぼ停止している。
この方法の改良は、楕円のノードについては、ノード自体の実際のエッジに対してテストすることであろうが、私は反対テストできるジオメトリまたはパスを私に提供するWPFの方法を見つけていません。
所属していません StackOverflow