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