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);
 }
示例#22
0
 internal void AddLongestNudgedSegment(LongestNudgedSegment segment)
 {
     setOfLongestSegs.Insert(segment);
 }
 internal void AddLongestNudgedSegment(LongestNudgedSegment segment) {
     setOfLongestSegs.Insert(segment);
 }