internal static ShapeContent ReadPolygonGeometry(BinaryReader reader) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } var box = new BoundingBox2D( reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian()); var numberOfParts = reader.ReadInt32LittleEndian(); var numberOfPoints = reader.ReadInt32LittleEndian(); var parts = new int[numberOfParts]; for (var partIndex = 0; partIndex < numberOfParts; partIndex++) { parts[partIndex] = reader.ReadInt32LittleEndian(); } var points = new Point[numberOfPoints]; for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { points[pointIndex] = new Point( reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian()); } return(new PolygonShapeContent(new Polygon(box, parts, points))); }
public BoundingBox2D ExpandWith(BoundingBox2D other) { return(new BoundingBox2D( Math.Min(XMin, other.XMin), Math.Min(YMin, other.YMin), Math.Max(XMax, other.XMax), Math.Max(YMax, other.YMax))); }
public Polygon( BoundingBox2D boundingBox, int[] parts, Point[] points) { BoundingBox = boundingBox ?? throw new ArgumentNullException(nameof(boundingBox)); Parts = parts ?? throw new ArgumentNullException(nameof(parts)); Points = points ?? throw new ArgumentNullException(nameof(points)); NumberOfParts = parts.Length; NumberOfPoints = points.Length; }
internal static ShapeContent ReadPolyLineMFromRecord(BinaryReader reader, ShapeRecordHeader header) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } var box = new BoundingBox2D( reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian()); var numberOfParts = reader.ReadInt32LittleEndian(); var numberOfPoints = reader.ReadInt32LittleEndian(); var parts = new int[numberOfParts]; for (var partIndex = 0; partIndex < numberOfParts; partIndex++) { parts[partIndex] = reader.ReadInt32LittleEndian(); } var points = new Point[numberOfPoints]; for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { points[pointIndex] = new Point( reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian()); } var contentLengthWithoutMeasures = ContentHeaderLength .Plus(ByteLength.Int32.Times(numberOfParts)) // Parts .Plus(ByteLength.Double.Times(numberOfPoints * 2)); // Points(X,Y) double[] measures; if (header.ContentLength > contentLengthWithoutMeasures) { measures = new double[numberOfPoints]; reader.ReadBytes(MeasureRangeByteLength.ToInt32()); // skip MeasureRange for (var measureIndex = 0; measureIndex < numberOfPoints; measureIndex++) { measures[measureIndex] = reader.ReadDoubleLittleEndian(); } } else { measures = new double[0]; } return(new PolyLineMShapeContent(new PolyLineM(box, parts, points, measures))); }
public PolyLineM( BoundingBox2D boundingBox, int[] parts, Point[] points, double[] measures) { BoundingBox = boundingBox ?? throw new ArgumentNullException(nameof(boundingBox)); Parts = parts ?? throw new ArgumentNullException(nameof(parts)); Points = points ?? throw new ArgumentNullException(nameof(points)); Measures = measures ?? throw new ArgumentNullException(nameof(measures)); NumberOfParts = parts.Length; NumberOfPoints = points.Length; MeasureRange = MeasureRange.FromMeasures(measures); }
internal static ShapeContent ReadPolyLineMGeometry(BinaryReader reader) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } var box = new BoundingBox2D( reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian()); var numberOfParts = reader.ReadInt32LittleEndian(); var numberOfPoints = reader.ReadInt32LittleEndian(); var parts = new int[numberOfParts]; for (var partIndex = 0; partIndex < numberOfParts; partIndex++) { parts[partIndex] = reader.ReadInt32LittleEndian(); } var points = new Point[numberOfPoints]; for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++) { points[pointIndex] = new Point( reader.ReadDoubleLittleEndian(), reader.ReadDoubleLittleEndian()); } double[] measures; if (reader.BaseStream.CanSeek && reader.BaseStream.Position != reader.BaseStream.Length) { measures = new double[numberOfPoints]; reader.ReadBytes(MeasureRangeByteLength.ToInt32()); // skip MeasureRange for (var measureIndex = 0; measureIndex < numberOfPoints; measureIndex++) { measures[measureIndex] = reader.ReadDoubleLittleEndian(); } } else { measures = new double[0]; } return(new PolyLineMShapeContent(new PolyLineM(box, parts, points, measures))); }
public void ExpandWithReturnsExpectedResult(BoundingBox2D sut, BoundingBox2D other, BoundingBox2D expected) { var result = sut.ExpandWith(other); Assert.Equal(expected, result); }
public bool Equals(BoundingBox2D other, double tolerance) => other != null && (double.IsNaN(XMin) && double.IsNaN(other.XMin) || Math.Abs(XMin - other.XMin) < tolerance) && (double.IsNaN(YMin) && double.IsNaN(other.YMin) || Math.Abs(YMin - other.YMin) < tolerance) && (double.IsNaN(XMax) && double.IsNaN(other.XMax) || Math.Abs(XMax - other.XMax) < tolerance) && (double.IsNaN(YMax) && double.IsNaN(other.YMax) || Math.Abs(YMax - other.YMax) < tolerance);
public bool Equals(BoundingBox2D other) => other != null && (double.IsNaN(XMin) && double.IsNaN(other.XMin) || XMin.Equals(other.XMin)) && (double.IsNaN(YMin) && double.IsNaN(other.YMin) || YMin.Equals(other.YMin)) && (double.IsNaN(XMax) && double.IsNaN(other.XMax) || XMax.Equals(other.XMax)) && (double.IsNaN(YMax) && double.IsNaN(other.YMax) || YMax.Equals(other.YMax));