/// <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;
        }
示例#3
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));
        }
示例#4
0
 /// <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);
        }
示例#6
0
 /// <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));
 }
示例#7
0
 /// <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]);
 }
示例#8
0
 /// <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);
 }
示例#10
0
        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);
        }
示例#11
0
        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));
        }