Question

J'ai une toile pour schématisant, et que vous souhaitez rejoindre les nœuds du diagramme par des lignes dirigées (extrémités de flèche). J'ai essayé l'approche d'ancrage, où les lignes ne se fixent à des points spécifiques sur les nœuds, mais qui n'a pas fonctionné pour moi, il avait l'air comme de la merde.

Je veux simplement une ligne du centre de chaque objet à l'autre, et arrêter la ligne au bord de noeuds pour la fin de la flèche pour afficher correctement. Mais trouver le bord d'un élément de toile pour tester les intersections contre est avérée difficile.

Toutes les idées?

Était-ce utile?

La solution

I obtenu en utilisant un procédé de travail du cadre de délimitation de l'élément. Il est pas parfait, puisque mes éléments ne sont pas parfaitement rectangulaire, mais il semble OK.

Fondamentalement, je trouve la zone de délimitation de l'élément en coordonnées Toile par:

    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));
    }

Ensuite, je trouve l'intersection du centre-à-centre la ligne contre chacun des quatre côtés du cadre de sélection, et en utilisant ce point d'intersection pour relier les deux éléments en forme de ligne.

J'ai trouvé le code d'intersection de tiers Ninjas: http://thirdpartyninjas.com/blog/2008/10/07 / ligne de segment intersection /

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);
            }
        }
    }

Et voilà! Les lignes sont maintenant établis comme si elles vont du centre de chaque noeud à l'autre, mais arrête approximativement au bord de noeud si l'extrémité de la flèche est visible.

Une amélioration de cette méthode serait de tester sur le bord réel du nœud lui-même, comme pour les noeuds elliptiques, mais je dois encore trouver une méthode WPF qui me fournit une géométrie ou chemin que je peux tester contre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top