void CreateVariablesOfLongestSegment(LongestNudgedSegment segment) { if (!segment.IsFixed) { var leftBound = segment.GetLeftBound(); var rightBound = segment.GetRightBound(); if (leftBound >= rightBound) //don't move the segment from the way it was generated { Solver.AddFixedVariable(segment.Id, SegmentPosition(segment, NudgingDirection)); segment.IsFixed = true; } else { Solver.AddVariable(segment.Id, SegmentPosition(segment, NudgingDirection), segment.IdealPosition, segment.Width); // Debug.Assert(leftBound + Curve.DistanceEpsilon < rightBound); //this assert does not hold for overlaps if (leftBound != Double.NegativeInfinity) { Solver.SetLowBound(leftBound, segment.Id); } if (rightBound != Double.PositiveInfinity) { Solver.SetUpperBound(segment.Id, rightBound); } } } else { Solver.AddFixedVariable(segment.Id, SegmentPosition(segment, NudgingDirection)); } }
static void CalculateIdealPositionsForLongestSegs(Path path, PointProjection projectionToPerp) { LongestNudgedSegment currentLongSeg = null; LongestNudgedSegment ret = null; double prevOffset = projectionToPerp(path.Start); foreach (var edge in path.PathEdges) { if (edge.LongestNudgedSegment != null) { currentLongSeg = edge.LongestNudgedSegment; if (ret != null) { double t; SetIdealPositionForSeg(ret, t = projectionToPerp(ret.Start), prevOffset, projectionToPerp(currentLongSeg.Start)); prevOffset = t; ret = null; } } else if (currentLongSeg != null) { ret = currentLongSeg; currentLongSeg = null; } } if (ret != null) { SetIdealPositionForSeg(ret, projectionToPerp(ret.Start), prevOffset, projectionToPerp(path.End)); } else if (currentLongSeg != null) { currentLongSeg.IdealPosition = projectionToPerp(currentLongSeg.Start); } }
void GoOverPathAndCreateLongSegs(Path path) { LongestNudgedSegment currentLongestSeg = null; var oppositeDir = CompassVector.OppositeDir(NudgingDirection); foreach (var edge in path.PathEdges) { var edgeDir = edge.Direction; if (edgeDir == NudgingDirection || edgeDir == oppositeDir) { if (currentLongestSeg == null) #if SHARPKIT //https://code.google.com/p/sharpkit/issues/detail?id=368 { edge.LongestNudgedSegment = currentLongestSeg = new LongestNudgedSegment(LongestNudgedSegs.Count); LongestNudgedSegs.Add(edge.LongestNudgedSegment); } #else { LongestNudgedSegs.Add( edge.LongestNudgedSegment = currentLongestSeg = new LongestNudgedSegment(LongestNudgedSegs.Count)); } #endif else { edge.LongestNudgedSegment = currentLongestSeg; } if (edge.IsFixed) { currentLongestSeg.IsFixed = true; } }
void ConstraintTwoLongestSegs(LongestNudgedSegment prevSeg, LongestNudgedSegment seg) { if (!prevSeg.IsFixed || !seg.IsFixed) { Solver.AddConstraint(prevSeg.Id, seg.Id); } }
Point ShiftedPoint(Point point, LongestNudgedSegment segment) { if (segment == null) { return(point); } var t = Solver.GetVariablePosition(segment.Id); return(NudgingDirection == Directions.North ? new Point(t, point.Y) : new Point(point.X, -t)); }
void ShowSegment(LongestNudgedSegment segment) { // ReSharper restore UnusedMember.Local var dd = GetObstacleBoundaries(Obstacles, "black"); var segtop = segment.Edges.Max(e => Math.Max(e.Source.Y, e.Target.Y)); var segbottom = segment.Edges.Min(e => Math.Min(e.Source.Y, e.Target.Y)); var segx = segment.Start.X; var seg = new DebugCurve(80, 1, "brown", new LineSegment(new Point(segx, segbottom), new Point(segx, segtop))); LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd.Concat(new[] { seg })); }
static ICurve LineSegOfLongestSeg(LongestNudgedSegment ls, Directions dir) { var projectionToDir = dir == Directions.East ? (PointProjection)(p => p.X) : (p => p.Y); var min = Double.PositiveInfinity; var max = Double.NegativeInfinity; foreach (var edge in ls.Edges) { UpdateMinMaxWithPoint(ref min, ref max, projectionToDir, edge.Source); UpdateMinMaxWithPoint(ref min, ref max, projectionToDir, edge.Target); } return(dir == Directions.East ? new LineSegment(min, -ls.IdealPosition, max, -ls.IdealPosition) : new LineSegment(ls.IdealPosition, min, ls.IdealPosition, max)); }
static void MoveLongestSegIdealPositionsInsideFeasibleInterval(LongestNudgedSegment seg) { if (seg.IsFixed) { return; } var leftBound = seg.GetLeftBound(); var rightBound = seg.GetRightBound(); if (seg.IdealPosition < leftBound) { seg.IdealPosition = leftBound; } else if (seg.IdealPosition > rightBound) { seg.IdealPosition = rightBound; } }
static void SetIdealPositionForSeg(LongestNudgedSegment segment, double segPosition, double offset0, double offset1) { var max = Math.Max(offset0, offset1); var min = Math.Min(offset0, offset1); if (min + ApproximateComparer.DistanceEpsilon < segPosition) { if (segPosition < max) { segment.IdealPosition = 0.5 * (max + min); } else { segment.IdealPosition = max; } } else { segment.IdealPosition = min; } }
void CreateConstraintsBetweenLongestSegmentsForSegment(LongestNudgedSegment segment) { var rightNeighbors = new Set <LongestNudgedSegment>(); foreach (var pathEdge in segment.Edges) { var axisEdge = pathEdge.AxisEdge; if (axisEdge != null) { foreach (var rightNeiAxisEdge in axisEdge.RightNeighbors) { foreach (var longSeg in rightNeiAxisEdge.LongestNudgedSegments) { rightNeighbors.Insert(longSeg); } } } } foreach (var seg in rightNeighbors) { ConstraintTwoLongestSegs(segment, seg); } }
static ICurve LineSegOfLongestSeg(LongestNudgedSegment ls, Directions dir) { var projectionToDir = dir == Directions.East ? (PointProjection)(p => p.X) : (p => p.Y); var min = Double.PositiveInfinity; var max = Double.NegativeInfinity; foreach (var edge in ls.Edges) { UpdateMinMaxWithPoint(ref min, ref max, projectionToDir, edge.Source); UpdateMinMaxWithPoint(ref min, ref max, projectionToDir, edge.Target); } return dir == Directions.East ? new LineSegment(min, -ls.IdealPosition, max, -ls.IdealPosition) : new LineSegment(ls.IdealPosition, min, ls.IdealPosition, max); }
static void MoveLongestSegIdealPositionsInsideFeasibleInterval(LongestNudgedSegment seg) { if (seg.IsFixed) return; var leftBound = seg.GetLeftBound(); var rightBound = seg.GetRightBound(); if (seg.IdealPosition < leftBound) seg.IdealPosition=leftBound; else if( seg.IdealPosition> rightBound) seg.IdealPosition=rightBound; }
void CreateConstraintsBetweenLongestSegmentsForSegment(LongestNudgedSegment segment) { var rightNeighbors = new Set<LongestNudgedSegment>(); foreach (var pathEdge in segment.Edges) { var axisEdge = pathEdge.AxisEdge; if (axisEdge != null) foreach (var rightNeiAxisEdge in axisEdge.RightNeighbors) foreach (var longSeg in rightNeiAxisEdge.LongestNudgedSegments) rightNeighbors.Insert(longSeg); } foreach (var seg in rightNeighbors) ConstraintTwoLongestSegs(segment, seg); }
static DebugCurve DebugCurveOfLongSeg(LongestNudgedSegment ls, string s, Directions dir) { return(new DebugCurve(1, s, LineSegOfLongestSeg(ls, dir))); }
void ConstraintTwoLongestSegs(LongestNudgedSegment prevSeg, LongestNudgedSegment seg) { if (!prevSeg.IsFixed || !seg.IsFixed) Solver.AddConstraint(prevSeg.Id, seg.Id); }
void CreateVariablesOfLongestSegment(LongestNudgedSegment segment) { if (!segment.IsFixed) { var leftBound = segment.GetLeftBound(); var rightBound = segment.GetRightBound(); if (leftBound >= rightBound) {//don't move the segment from the way it was generated Solver.AddFixedVariable(segment.Id, SegmentPosition(segment, NudgingDirection)); segment.IsFixed = true; } else { Solver.AddVariable(segment.Id, SegmentPosition(segment, NudgingDirection), segment.IdealPosition, segment.Width); // Debug.Assert(leftBound + Curve.DistanceEpsilon < rightBound); //this assert does not hold for overlaps if (leftBound != Double.NegativeInfinity) Solver.SetLowBound(leftBound, segment.Id); if (rightBound != Double.PositiveInfinity) Solver.SetUpperBound(segment.Id, rightBound); } } else Solver.AddFixedVariable(segment.Id, SegmentPosition(segment, NudgingDirection)); }
void ShowSegment(LongestNudgedSegment segment) { // ReSharper restore UnusedMember.Local var dd = GetObstacleBoundaries(Obstacles, "black"); var segtop = segment.Edges.Max(e => Math.Max(e.Source.Y, e.Target.Y)); var segbottom = segment.Edges.Min(e => Math.Min(e.Source.Y, e.Target.Y)); var segx = segment.Start.X; var seg = new DebugCurve(80, 1, "brown", new LineSegment(new Point(segx, segbottom), new Point(segx, segtop))); LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd.Concat(new[] { seg })); }
static DebugCurve DebugCurveOfLongSeg(LongestNudgedSegment ls, string s, Directions dir) { return new DebugCurve(1, s, LineSegOfLongestSeg(ls, dir)); }
static void SetIdealPositionForSeg(LongestNudgedSegment segment, double segPosition, double offset0, double offset1) { var max = Math.Max(offset0, offset1); var min = Math.Min(offset0, offset1); if (min + ApproximateComparer.DistanceEpsilon < segPosition) if (segPosition < max) segment.IdealPosition = 0.5 * (max + min); else segment.IdealPosition = max; else segment.IdealPosition = min; }
void GoOverPathAndCreateLongSegs(Path path) { LongestNudgedSegment currentLongestSeg = null; var oppositeDir = CompassVector.OppositeDir(NudgingDirection); foreach (var edge in path.PathEdges) { var edgeDir = edge.Direction; if (edgeDir == NudgingDirection || edgeDir == oppositeDir) { if (currentLongestSeg == null) #if SHARPKIT //https://code.google.com/p/sharpkit/issues/detail?id=368 { edge.LongestNudgedSegment = currentLongestSeg = new LongestNudgedSegment(LongestNudgedSegs.Count); LongestNudgedSegs.Add(edge.LongestNudgedSegment); } #else LongestNudgedSegs.Add( edge.LongestNudgedSegment = currentLongestSeg = new LongestNudgedSegment(LongestNudgedSegs.Count)); #endif else edge.LongestNudgedSegment = currentLongestSeg; if (edge.IsFixed) currentLongestSeg.IsFixed = true; } else { //the edge is perpendicular to "direction" edge.LongestNudgedSegment = null; currentLongestSeg = null; } }
Point ShiftedPoint(Point point, LongestNudgedSegment segment) { if (segment == null) return point; var t = Solver.GetVariablePosition(segment.Id); return NudgingDirection == Directions.North ? new Point(t, point.Y) : new Point(point.X, -t); }
internal void AddLongestNudgedSegment(LongestNudgedSegment segment) { setOfLongestSegs.Insert(segment); }
internal void AddLongestNudgedSegment(LongestNudgedSegment segment) { setOfLongestSegs.Insert(segment); }