예제 #1
0
        private bool IsPolylineRectangle()
        {
            if (this.PaddedPolyline.PolylinePoints.Count() != 4)
            {
                return(false);
            }

            var ppt     = this.PaddedPolyline.StartPoint;
            var nextPpt = ppt.NextOnPolyline;
            var dir     = CompassVector.DirectionsFromPointToPoint(ppt.Point, nextPpt.Point);

            if (!CompassVector.IsPureDirection(dir))
            {
                return(false);
            }
            do
            {
                ppt     = nextPpt;
                nextPpt = ppt.NextOnPolyline;
                var nextDir = CompassVector.DirectionsFromPointToPoint(ppt.Point, nextPpt.Point);

                // We know the polyline is clockwise.
                if (nextDir != CompassVector.RotateRight(dir))
                {
                    return(false);
                }
                dir = nextDir;
            } while (ppt != this.PaddedPolyline.StartPoint);
            return(true);
        }
예제 #2
0
        PathEdge CreatePathEdge(Point p0, Point p1, double width)
        {
            var dir = CompassVector.DirectionsFromPointToPoint(p0, p1);

            switch (dir)
            {
            case Directions.East:
            case Directions.North:
                return(new PathEdge(GetAxisEdge(p0, p1), width));

            case Directions.South:
            case Directions.West:

                return(new PathEdge(GetAxisEdge(p1, p0), width)
                {
                    Reversed = true
                });

            default:
                throw new InvalidOperationException(
#if TEST_MSAGL
                          "Not a rectilinear path"
#endif
                          );
            }
        }
예제 #3
0
 internal AxisEdge(VisibilityVertex source, VisibilityVertex target)
     : base(source, target)
 {
     RightBound = double.PositiveInfinity;
     LeftBound  = double.NegativeInfinity;
     Direction  = CompassVector.DirectionsFromPointToPoint(source.Point, target.Point);
     Debug.Assert(Direction == Directions.East || Direction == Directions.North);
 }
        private bool InitEntryDirectionsAtTarget(VisibilityVertex vert)
        {
            EntryDirectionsToTarget = Directions.None;

            // This routine is only called once so don't worry about optimizing foreach.
            foreach (var edge in vert.OutEdges)
            {
                EntryDirectionsToTarget |= CompassVector.DirectionsFromPointToPoint(edge.TargetPoint, vert.Point);
            }
            foreach (var edge in vert.InEdges)
            {
                EntryDirectionsToTarget |= CompassVector.DirectionsFromPointToPoint(edge.SourcePoint, vert.Point);
            }
            // If this returns false then the target is isolated.
            return(EntryDirectionsToTarget != Directions.None);
        }
        bool IsStaircase(Point[] pts, int offset, SegWithIndex[] segsToIgnore, out bool canHaveStaircaseAtI)
        {
            var a = pts[offset];
            var b = pts[offset + 1];
            var c = pts[offset + 2];
            var d = pts[offset + 3];
            var f = pts[offset + 4];

            canHaveStaircaseAtI = false;
            if (CompassVector.DirectionsFromPointToPoint(a, b) != CompassVector.DirectionsFromPointToPoint(c, d) ||
                CompassVector.DirectionsFromPointToPoint(b, c) != CompassVector.DirectionsFromPointToPoint(d, f))
            {
                return(false);
            }

            c = GetFlippedPoint(pts, offset);
            if (IntersectObstacleHierarchy(b, c, d))
            {
                return(false);
            }
            canHaveStaircaseAtI = true;
            return(!Crossing(b, c, segsToIgnore));
        }
예제 #6
0
        private bool InitEntryDirectionsAtTarget(VisibilityVertex vert)
        {
            EntryDirectionsToTarget = Directions.None;

            // This routine is only called once so don't worry about optimizing foreach.
            foreach (var edge in vert.OutEdges)
            {
#if SHARPKIT //http://code.google.com/p/sharpkit/issues/detail?id=368 property assignment not working with |= operator
                EntryDirectionsToTarget = EntryDirectionsToTarget | CompassVector.DirectionsFromPointToPoint(edge.TargetPoint, vert.Point);
#else
                EntryDirectionsToTarget |= CompassVector.DirectionsFromPointToPoint(edge.TargetPoint, vert.Point);
#endif
            }
            foreach (var edge in vert.InEdges)
            {
#if SHARPKIT //http://code.google.com/p/sharpkit/issues/detail?id=368 property assignment not working with |= operator
                EntryDirectionsToTarget = EntryDirectionsToTarget | CompassVector.DirectionsFromPointToPoint(edge.SourcePoint, vert.Point);
#else
                EntryDirectionsToTarget |= CompassVector.DirectionsFromPointToPoint(edge.SourcePoint, vert.Point);
#endif
            }
            // If this returns false then the target is isolated.
            return(EntryDirectionsToTarget != Directions.None);
        }
예제 #7
0
// ReSharper restore InconsistentNaming

        #region Direction_Utilities

        // These call through to CompassVector methods, assuming operands that use PointComparer rounding.
        internal static Directions GetDirections(Point a, Point b)
        {
            Assert_Rounded(a);
            Assert_Rounded(b);
            return(CompassVector.DirectionsFromPointToPoint(a, b));
        }