/// <summary> /// Compares two <see cref="Coordinate" />s for their relative position along a segment /// lying in the specified <see cref="Octant" />. /// </summary> /// <param name="octant"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <returns> /// -1 if node0 occurs first, or /// 0 if the two nodes are equal, or /// 1 if node1 occurs first. /// </returns> public static int Compare(Octants octant, Coordinate p0, Coordinate p1) { // nodes can only be equal if their coordinates are equal if (p0.Equals2D(p1)) return 0; int xSign = RelativeSign(p0.X, p1.X); int ySign = RelativeSign(p0.Y, p1.Y); switch (octant) { case Octants.Zero: return CompareValue(xSign, ySign); case Octants.One: return CompareValue(ySign, xSign); case Octants.Two: return CompareValue(ySign, -xSign); case Octants.Three: return CompareValue(-xSign, ySign); case Octants.Four: return CompareValue(-xSign, -ySign); case Octants.Five: return CompareValue(-ySign, -xSign); case Octants.Six: return CompareValue(-ySign, xSign); case Octants.Seven: return CompareValue(xSign, -ySign); } Assert.ShouldNeverReachHere("invalid octant value: " + octant); return 0; }
/// <summary> /// Compares two <see cref="Coordinate" />s for their relative position along a segment /// lying in the specified <see cref="Octant" />. /// </summary> /// <param name="octant"></param> /// <param name="p0"></param> /// <param name="p1"></param> /// <returns> /// -1 if node0 occurs first, or /// 0 if the two nodes are equal, or /// 1 if node1 occurs first. /// </returns> public static int Compare(Octants octant, ICoordinate p0, ICoordinate p1) { // nodes can only be equal if their coordinates are equal if (p0.Equals2D(p1)) return 0; int xSign = RelativeSign(p0.X, p1.X); int ySign = RelativeSign(p0.Y, p1.Y); switch (octant) { case Octants.Zero: return CompareValue(xSign, ySign); case Octants.One: return CompareValue(ySign, xSign); case Octants.Two: return CompareValue(ySign, -xSign); case Octants.Three: return CompareValue(-xSign, ySign); case Octants.Four: return CompareValue(-xSign, -ySign); case Octants.Five: return CompareValue(-ySign, -xSign); case Octants.Six: return CompareValue(-ySign, xSign); case Octants.Seven: return CompareValue(xSign, -ySign); } Assert.ShouldNeverReachHere("invalid octant value: " + octant); return 0; }
public void CreateMapToOctant1() { Action <int, Vector> testMapping = (octant, toMap) => { var mapper = Octants.CreateMapToOctant1(octant); Assert.AreEqual(Vector.Create(2, 1), mapper(toMap)); }; // End is expected to map to 2, 1 in Octant 1 // Octant 1 testMapping(1, Vector.Create(2, 1)); // Octant 2 testMapping(2, Vector.Create(2, -1)); // Octant 3 testMapping(3, Vector.Create(1, -2)); // Octant 4 testMapping(4, Vector.Create(-1, -2)); // Octant 5 testMapping(5, Vector.Create(-2, -1)); // Octant 6 testMapping(6, Vector.Create(-2, 1)); // Octant 7 testMapping(7, Vector.Create(-1, 2)); // Octant 8 testMapping(8, Vector.Create(1, 2)); }
/// <summary> /// Initializes a new instance of the <see cref="SegmentNode"/> class. /// </summary> /// <param name="segString"></param> /// <param name="coord"></param> /// <param name="segmentIndex"></param> /// <param name="segmentOctant"></param> public SegmentNode(SegmentString segString, ICoordinate coord, int segmentIndex, Octants segmentOctant) { this.segString = segString; this.Coordinate = new Coordinate(coord); this.SegmentIndex = segmentIndex; this.segmentOctant = segmentOctant; isInterior = !coord.Equals2D(segString.GetCoordinate(segmentIndex)); }
private void CheckNodePosition(LineSegment seg, Coordinate p0, Coordinate p1, int expectedPositionValue) { Octants octant = Octant.GetOctant(seg.P0, seg.P1); int posValue = SegmentPointComparator.Compare(octant, p0, p1); Console.WriteLine(octant + " " + p0 + " " + p1 + " " + posValue); Assert.IsTrue(posValue == expectedPositionValue); }
/// <summary> /// Initializes a new instance of the <see cref="SegmentNode"/> class. /// </summary> /// <param name="segString"></param> /// <param name="coord"></param> /// <param name="segmentIndex"></param> /// <param name="segmentOctant"></param> public SegmentNode(INodableSegmentString segString, Coordinate coord, int segmentIndex, Octants segmentOctant) { Coord = null; _segString = segString; Coord = new Coordinate(coord.X, coord.Y, coord.Z); SegmentIndex = segmentIndex; _segmentOctant = segmentOctant; _isInterior = !coord.Equals2D(segString.Coordinates[segmentIndex]); }
private void checkNodePosition(Octants octant, double x0, double y0, double x1, double y1, int expectedPositionValue ) { int posValue = SegmentPointComparator.Compare(octant, new Coordinate(x0, y0), new Coordinate(x1, y1) ); Assert.IsTrue(posValue == expectedPositionValue); }
public void BuildCoordinateMapper() { // End is expected to map to 2, 1 in Octant 1 var start = Vector.Create(0, 0); // Octant 1 Assert.AreEqual( 1, Octants.DetermineOctant(start, Vector.Create(2, 1))); // Octant 2 Assert.AreEqual( 2, Octants.DetermineOctant(start, Vector.Create(2, -1))); // Octant 3 Assert.AreEqual( 3, Octants.DetermineOctant(start, Vector.Create(1, -2))); // Octant 4 Assert.AreEqual( 4, Octants.DetermineOctant(start, Vector.Create(-1, -2))); // Octant 5 Assert.AreEqual( 5, Octants.DetermineOctant(start, Vector.Create(-2, -1))); // Octant 6 Assert.AreEqual( 6, Octants.DetermineOctant(start, Vector.Create(-2, 1))); // Octant 7 Assert.AreEqual( 7, Octants.DetermineOctant(start, Vector.Create(-1, 2))); // Octant 8 Assert.AreEqual( 8, Octants.DetermineOctant(start, Vector.Create(1, 2))); // Using offset coordinates Assert.AreEqual( 8, Octants.DetermineOctant( start + Directions.SouthWest, Vector.Create(1, 2) + Directions.SouthWest)); }