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