protected override bool GetNextSliverArea(out double area, out double perimeter) { _latestPartSegments = null; if (!_enumValid) { area = double.NaN; perimeter = double.NaN; return(false); } SegmentProxy segment = Assert.NotNull(_segmentsEnum.Current); int currentPart = segment.PartIndex; int segmentCount = _indexedMultiPatch.GetPartSegmentCount(currentPart); var partSegments = new List <SegmentProxy>(segmentCount) { segment }; while ((_enumValid = _segmentsEnum.MoveNext()) && Assert.NotNull(_segmentsEnum.Current).PartIndex == currentPart) { partSegments.Add(_segmentsEnum.Current); } List <Pnt> planePoints = QaGeometryUtils.GetPoints(partSegments); Plane plane = QaGeometryUtils.CreatePlane((IEnumerable <SegmentProxy>)partSegments); QaGeometryUtils.CalculateProjectedArea(plane, planePoints, out area, out perimeter); _latestPartSegments = partSegments; return(true); }
public void CanCalculateVerticalProjectedAreaDiagonalXY() { var wksPointZs = new List <WKSPointZ> { new WKSPointZ { X = 0, Y = 0, Z = 0 }, new WKSPointZ { X = 10, Y = 10, Z = 0 }, new WKSPointZ { X = 10, Y = 10, Z = 10 }, new WKSPointZ { X = 0, Y = 0, Z = 10 }, new WKSPointZ { X = 0, Y = 0, Z = 0 } }; List <Pnt> points = wksPointZs.Select(wksPointZ => QaGeometryUtils.CreatePoint3D(wksPointZ)).ToList(); var pointsWithoutEndPoint = new List <Pnt>(points); pointsWithoutEndPoint.RemoveAt(points.Count - 1); Plane plane = QaGeometryUtils.CreatePlane(pointsWithoutEndPoint); double area; double perimeter; QaGeometryUtils.CalculateProjectedArea(plane, points, out area, out perimeter); Console.WriteLine(@"area: {0} perimeter: {1}", area, perimeter); const double e = 0.0000001; Assert.AreEqual(141.421356237309, Math.Abs(area), e); Assert.AreEqual(48.2842712474619, perimeter, e); }
public void CanCalculateVerticalProjectedAreaConstantX2() { // using coordinates from an actual building face (exactly north-south oriented) var wksPointZs = new List <WKSPointZ> { new WKSPointZ { X = 2722584.8725, Y = 1252311.12875, Z = 618.42624999999 }, new WKSPointZ { X = 2722584.8725, Y = 1252309.3725, Z = 619.654999999984 }, new WKSPointZ { X = 2722584.8725, Y = 1252304.75375, Z = 616.388749999984 }, new WKSPointZ { X = 2722584.8725, Y = 1252311.12875, Z = 618.42624999999 } }; List <Pnt> points = wksPointZs.Select(wksPointZ => QaGeometryUtils.CreatePoint3D(wksPointZ)).ToList(); var pointsWithoutEndPoint = new List <Pnt>(points); pointsWithoutEndPoint.RemoveAt(points.Count - 1); Plane plane = QaGeometryUtils.CreatePlane(pointsWithoutEndPoint); double area; double perimeter; QaGeometryUtils.CalculateProjectedArea(plane, points, out area, out perimeter); Console.WriteLine(@"area: {0} perimeter: {1}", area, perimeter); const double e = 0.000001; Assert.AreEqual(5.70582031258122, Math.Abs(area), e); Assert.AreEqual(14.4930667883504, perimeter, e); }
public void CanCalculateHorizontalProjectedArea() { var wksPointZs = new List <WKSPointZ> { new WKSPointZ { X = 0, Y = 0, Z = 0 }, new WKSPointZ { X = 10, Y = 0, Z = 0 }, new WKSPointZ { X = 10, Y = 10, Z = 0 }, new WKSPointZ { X = 0, Y = 10, Z = 0 }, new WKSPointZ { X = 0, Y = 0, Z = 0 } }; List <Pnt> points = wksPointZs.Select(wksPointZ => QaGeometryUtils.CreatePoint3D(wksPointZ)).ToList(); var pointsWithoutEndPoint = new List <Pnt>(points); pointsWithoutEndPoint.RemoveAt(points.Count - 1); Plane plane = QaGeometryUtils.CreatePlane(pointsWithoutEndPoint); double area; double perimeter; QaGeometryUtils.CalculateProjectedArea(plane, points, out area, out perimeter); Console.WriteLine(@"area: {0} perimeter: {1}", area, perimeter); Assert.AreEqual(100, Math.Abs(area)); Assert.AreEqual(40, perimeter); }