static void DrawEdgeWithPort(Edge edge, InteractiveEdgeRouter portRouter, double par0, double par1) { var port0 = new CurvePort(edge.Source.BoundaryCurve, par0); var port1 = new CurvePort(edge.Target.BoundaryCurve,par1); SmoothedPolyline sp; var spline = portRouter.RouteSplineFromPortToPortWhenTheWholeGraphIsReady(port0, port1, true, out sp); Arrowheads.TrimSplineAndCalculateArrowheads(edge.EdgeGeometry, edge.Source.BoundaryCurve, edge.Target.BoundaryCurve, spline, true, false); }
static IEnumerable<Edge> CreateEdgesForGroupRouting(IEnumerable<Cluster> clusters) { var c = GetClusterById(clusters, "c"); var f = GetClusterById(clusters, "f"); var a = c.Clusters.Single(s => s.UserData.Equals("a")); var b = c.Clusters.Single(s => s.UserData.Equals("b")); var d = f.Clusters.Single(s => s.UserData.Equals("d")); var e = f.Clusters.Single(s => s.UserData.Equals("e")); var h = GetClusterById(clusters, "h"); var g = GetClusterById(clusters, "g"); var l = GetClusterById(clusters, "l"); var k = GetClusterById(clusters, "k"); var ports = new Dictionary<Cluster, Set<Port>>(); AddPortToShape(k, ports, new CurvePort(k.BoundaryCurve, 0.4*(k.BoundaryCurve.ParEnd + k.BoundaryCurve.ParStart))); AddPortToShape(l, ports); AddPortToShape(a, ports); AddPortToShape(b, ports); AddPortToShape(d, ports); AddPortToShape(e, ports); AddPortToShape(h, ports); AddPortToShape(g, ports); var hSecondPort = new CurvePort(h.BoundaryCurve, 0.1); ports[h].Insert(hSecondPort); var hFreePort = new FloatingPort(null, new Point(-129, -55)); var kFreePort = new FloatingPort(null, new Point(137, -51)); ports[h].Insert(hFreePort); ports[k].Insert(kFreePort); var fFreePort = new FloatingPort(null, new Point(3, 3)); var kFreePort0 = new FloatingPort(null, new Point(106, 8)); AddPortToShape(f,ports, fFreePort); AddPortToShape(k, ports, kFreePort0); AddPortToShape(c,ports,new CurvePort(c.BoundaryCurve, 0)); AddPortToShape(f, ports,new FloatingPort(f.BoundaryCurve, f.BoundingBox.Center)); var freePort0 = new FloatingPort(null, new Point(72, -1.3)); var halfFreeEdge = new EdgeGeometry(freePort0, ports[a].First()); var freePort1 = new FloatingPort(null, new Point(-122, 110)); var freeEdge = new EdgeGeometry(freePort0, freePort1); var ab = new EdgeGeometry(ports[a].First(), ports[b].First()); var abE = new Edge(a, b) {EdgeGeometry = ab}; var ae = new EdgeGeometry(ports[a].First(), ports[e].First()); var aeE = new Edge(a, e) {EdgeGeometry = ae}; var de = new EdgeGeometry(ports[d].First(), ports[e].First()); var deE = new Edge(d, e) {EdgeGeometry = de}; var ad = new EdgeGeometry(ports[a].First(), ports[d].First()); var adE = new Edge(a, d) {EdgeGeometry = ad}; var he = new EdgeGeometry(ports[h].First(), ports[e].First()); var heE = new Edge(h, e) {EdgeGeometry = he}; var gd = new EdgeGeometry(ports[g].First(), ports[d].First()); var gdE = new Edge(g, d) {EdgeGeometry = gd}; var lg = new EdgeGeometry(ports[l].First(), ports[g].First()); var lgE = new Edge(l, g) {EdgeGeometry = lg}; var le = new EdgeGeometry(ports[l].First(), ports[e].First()); var leE = new Edge(l, e) {EdgeGeometry = le}; var ca = new EdgeGeometry(ports[c].First(), ports[a].First()); var caE = new Edge(c, a) {EdgeGeometry = ca}; var cd = new EdgeGeometry(ports[c].First(), ports[d].First()); var cdE = new Edge(c, d) {EdgeGeometry = cd}; var hl = new EdgeGeometry(hSecondPort, ports[l].First()); var hlE = new Edge(h, l) {EdgeGeometry = hl}; var lh = new EdgeGeometry(ports[l].First(), hSecondPort); var lhE = new Edge(l, h) {EdgeGeometry = lh}; var ha = new EdgeGeometry(hSecondPort, ports[a].First()); var haE = new Edge(h, a) {EdgeGeometry = ha}; var hk = new EdgeGeometry(hSecondPort, ports[k].First()); var hkE = new Edge(h, k) {EdgeGeometry = hk}; var hk0 = new EdgeGeometry(hFreePort, kFreePort); var hk0E = new Edge(h, k) {EdgeGeometry = hk0}; var fk = new EdgeGeometry(fFreePort, kFreePort0); var fkE = new Edge(f, k) {EdgeGeometry = fk}; var hThirdPort = new CurvePort(h.BoundaryCurve, 0.5); var halfFreeInside = new EdgeGeometry(ports[b].First(), freePort1); //var halfFreeInside = new Edge(b, d) { EdgeGeometry = ad }; ports[h].Insert(hThirdPort); var lSecondPort = new CurvePort(l.BoundaryCurve, 0); ports[l].Insert(lSecondPort); var hThirdLSecond = new EdgeGeometry(hThirdPort, lSecondPort); var hThirdLSecondE = new Edge(h, l) {EdgeGeometry = hThirdLSecond}; // return new[] { // /*halfFreeInside, freeEdge,*/ halfFreeEdge, lh // }; return new[] { lhE, abE, aeE, deE, adE, heE, gdE, lgE, leE, cdE, hlE, hThirdLSecondE, caE, haE, hkE, hk0E, fkE }; }
bool InsideOfTheAllowedConeOfBoundaryPort(Point pointToTest, CurvePort port) { ICurve boundaryCurve = port.Curve; bool curveIsClockwise = InteractiveObstacleCalculator.CurveIsClockwise(boundaryCurve, PointInsideOfConvexCurve( boundaryCurve)); Point portLocation = port.Location; Point pointOnTheRightConeSide = GetPointOnTheRightBoundaryPortConeSide(portLocation, boundaryCurve, curveIsClockwise, port.Parameter); Point pointOnTheLeftConeSide = GetPointOnTheLeftBoundaryPortConeSide(portLocation, boundaryCurve, curveIsClockwise, port.Parameter); return Point.GetTriangleOrientation(portLocation, pointOnTheRightConeSide, pointToTest) != TriangleOrientation.Clockwise && Point.GetTriangleOrientation(portLocation, pointToTest, pointOnTheLeftConeSide) != TriangleOrientation.Clockwise; }