using System; using System.Diagnostics; using Microsoft.Msagl.Core.Geometry; using Microsoft.Msagl.Routing.ConstrainedDelaunayTriangulation; namespace Microsoft.Msagl.Routing { /// /// the edge direction is from the upperSite to lowerSite /// #if TEST_MSAGL [Serializable] #endif public class CdtEdge { /// /// public CdtSite upperSite; /// /// public CdtSite lowerSite; /// /// CdtTriangle ccwTriangle; //in this triangle the edge goes counterclockwise /// /// CdtTriangle cwTriangle; //in this triangle the edge goes clockwise, against the triangle orientation /// /// is an obstacle side, or a given segment /// public bool Constrained; /// /// /// /// public CdtEdge(CdtSite a, CdtSite b) { var above = Cdt.Above(a.Point, b.Point); if (above == 1) { upperSite = a; lowerSite = b; } else { Debug.Assert(above != 0); lowerSite = a; upperSite = b; } upperSite.AddEdgeToSite(this); } /// /// the amount of free space around the edge /// internal double Capacity = 1000000; /// /// the amount of residual free space around the edge /// public double ResidualCapacity { get; set; } /// /// public CdtTriangle CcwTriangle { get { return ccwTriangle; } set { Debug.Assert(value == null || cwTriangle==null || value.OppositeSite(this) != cwTriangle.OppositeSite(this)); ccwTriangle = value; } } /// /// public CdtTriangle CwTriangle { get { return cwTriangle; } set { Debug.Assert(value == null || ccwTriangle==null || value.OppositeSite(this) != ccwTriangle.OppositeSite(this)); cwTriangle = value; } } /// /// returns the trianlge on the edge opposite to the site /// /// /// public CdtTriangle GetOtherTriangle(CdtSite p) { return cwTriangle.Contains(p) ? ccwTriangle : cwTriangle; } /// /// /// /// public bool IsAdjacent(CdtSite pi) { return pi == upperSite || pi == lowerSite; } /// /// /// /// public CdtTriangle GetOtherTriangle(CdtTriangle triangle) { return ccwTriangle == triangle ? cwTriangle : ccwTriangle; } /// /// Returns a string that represents the current object. /// /// /// A string that represents the current object. /// /// 2 public override string ToString() { return String.Format("({0},{1})", upperSite, lowerSite); } /// /// /// /// public CdtSite OtherSite(CdtSite site) { Debug.Assert(IsAdjacent(site)); return upperSite == site ? lowerSite : upperSite; } } }