using System; using System.Diagnostics; using System.Globalization; using Microsoft.Msagl.Core.Geometry; namespace Microsoft.Msagl.Routing.Visibility { /// /// an edge connecting two VisibilityVertices /// [DebuggerDisplay("({Source.Point.X} {Source.Point.Y})->({Target.Point.X} {Target.Point.Y}) ({Weight})")] public class VisibilityEdge { internal double LengthMultiplier = 1; internal VisibilityEdge() { } internal VisibilityEdge(VisibilityVertex source, VisibilityVertex target, double weight) { Debug.Assert(source.Point != target.Point, "Self-edges are not allowed"); Source = source; Target = target; Weight = weight; } internal VisibilityEdge(VisibilityVertex source, VisibilityVertex target) : this (source, target, 1.0) {} internal double Weight { get; private set; } internal const double DefaultWeight = 1.0; /// ///returns true if and only if the edge can be passed /// internal Func IsPassable { get; set; } /// /// edge source point /// public Point SourcePoint { get { return Source.Point; } } /// /// edge target point /// public Point TargetPoint { get { return Target.Point; } } internal VisibilityVertex Source { get; set; } internal VisibilityVertex Target { get; set; } internal double Length { get { return (SourcePoint-TargetPoint).Length*LengthMultiplier; } } /// /// Rounded representation; DebuggerDisplay shows the unrounded form. /// /// public override string ToString() { return String.Format(CultureInfo.InvariantCulture, "{0}->{1} ({2})", Source, Target, Weight.ToString("0.0###", CultureInfo.InvariantCulture)); } internal VisibilityEdge ReversedClone() { return new VisibilityEdge(Target, Source); } internal VisibilityEdge Clone() { return new VisibilityEdge(Source, Target); } } }