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 CanProjectToPlaneTest() { var construction = new MultiPatchConstruction(); construction.StartRing(0, 0, 0) .Add(5, 0, 0) .Add(5, 0, 5) .Add(0, 0, 5); IMultiPatch multiPatch = construction.MultiPatch; IIndexedMultiPatch indexedMultiPatch = QaGeometryUtils.CreateIndexedMultiPatch(multiPatch); IList <Pnt> points = QaGeometryUtils.GetPoints(indexedMultiPatch.GetSegments()); Plane plane = QaGeometryUtils.CreatePlane(points); IList <WKSPointZ> projected = QaGeometryUtils.ProjectToPlane(plane, points); ValidateForm(indexedMultiPatch, projected); }
private static WKSPointZ[] GetWksPointZs( [NotNull] IIndexedSegments indexedSegments, int partIndex) { int partSegmentCount = indexedSegments.GetPartSegmentCount(partIndex); var segments = new List <SegmentProxy>(partSegmentCount); for (int segmentIndex = 0; segmentIndex < partSegmentCount; segmentIndex++) { segments.Add(indexedSegments.GetSegment(partIndex, segmentIndex)); } var wksPoints = new List <WKSPointZ>(partSegmentCount + 1); foreach (Pnt point in QaGeometryUtils.GetPoints(segments)) { wksPoints.Add(QaGeometryUtils.GetWksPoint(point)); } return(wksPoints.ToArray()); }