public PointIterator <R2Point> RetrievePointIterator() { DoubleLinkedList <R2Point> linkedList = new DoubleLinkedList <R2Point>(); for (int index = 0; index < this.linkedList.Size; index++) { R2NCDirection nonCircularDirection = this.linkedList.GetAt(index); PointIterator <R2Point> iterator = nonCircularDirection.RetrievePointIterator(); while (iterator.HasNext()) { linkedList.Add(iterator.GetNext()); } } return(new PointIterator <R2Point>(0, linkedList)); }
candidatePointInfo getCandidateConvexPoint(zz2DPoint lPointToSolve) { candidatePointInfo lCandidatePointInfo=new candidatePointInfo(); PointIterator lConvexIterator = new PointIterator(); lConvexIterator.addPolygon(mOutSidePoint.getConvexPoints()); foreach (var lHole in mHolePoint) { lConvexIterator.addPolygon(lHole.getConvexPoints()); } while (lConvexIterator.moveNext() != null) { zz2DPoint lNowPoint = lConvexIterator.nowPointDate.point; if (canLink(lPointToSolve, lNowPoint)) { var lNewCandidatePointInfo = new candidatePointInfo(lConvexIterator.nowPointDate); lNewCandidatePointInfo.scoresUp(); if (isConcaveCleared(lPointToSolve, lNowPoint)) { lNewCandidatePointInfo.scoresUp(candidatePointInfo.scoresOfClearSelfConcave); } if (lNewCandidatePointInfo.scores > lCandidatePointInfo.scores) lCandidatePointInfo = lNewCandidatePointInfo; if (lCandidatePointInfo.scores > candidatePointInfo.scoresOfClearSelfConcave) break; } } return lCandidatePointInfo; }
candidatePointInfo getCandidateConcavePoint(out PointDate lPointDataToSolve) { var lCandidatePointInfo = new candidatePointInfo(); PointIterator lConcaveIterator = new PointIterator(); lConcaveIterator.addPolygon(mOutSidePoint.getConcavePoints()); foreach (var lHole in mHolePoint) { lConcaveIterator.addPolygon(lHole.getConcavePoints()); } lPointDataToSolve = lConcaveIterator.moveNext(); //if(lPointDataToSolve==null) //{ // //无凹点,返回自身所有的点 // return new zzSimplyPolygon[] { mOutSidePoint }; //} zz2DPoint lPointToSolve = lPointDataToSolve.point; //遍历凹点 while (lConcaveIterator.moveNext() != null) { zz2DPoint lNowPoint = lConcaveIterator.nowPointDate.point; if (canLink(lPointToSolve, lNowPoint)) { var lNewCandidatePointInfo = new candidatePointInfo(lConcaveIterator.nowPointDate); lNewCandidatePointInfo.scoresUp(); //对结果评分 if (isConcaveCleared(lPointToSolve, lNowPoint)) { lNewCandidatePointInfo.scoresUp(candidatePointInfo.scoresOfClearSelfConcave); } if (isConcaveCleared(lNowPoint, lPointToSolve)) { lNewCandidatePointInfo.scoresUp(candidatePointInfo.scoresOfClearOtherConcave); } //优于前次结果,则替代之前的 if (lNewCandidatePointInfo.scores > lCandidatePointInfo.scores) lCandidatePointInfo = lNewCandidatePointInfo; //连接获得高分时,则不再遍历 if (lCandidatePointInfo.scores > candidatePointInfo.scoresOfClearSelfConcave + candidatePointInfo.scoresOfClearOtherConcave) break; } } return lCandidatePointInfo; }
PointIterator createConcaveIterator() { PointIterator lOut = new PointIterator(); lOut.addPolygon(mOutSidePoint.getConcavePoints()); foreach (var lHolePolygon in mHolePoint) { lOut.addPolygon(lHolePolygon.getConcavePoints()); } return lOut; }
static void Main(string[] args) { foreach (string path in args) { PointReader ps = load(path); output(String.Format(" Number of Points: {0}\n", ps.getNumPoints())); { Bounds b = ps.getBounds(); output(String.Format(" Bounds Min: {0} {1} {2}\n", b.x.min, b.y.min, b.z.min)); output(String.Format(" Bounds Max: {0} {1} {2}\n", b.x.max, b.y.max, b.z.max)); } output(String.Format(" Scale: {0} {1} {2}\n", ps.getScale()[0], ps.getScale()[2], ps.getScale()[2])); output(String.Format(" Offset: {0} {1} {2}\n", ps.getOffset()[0], ps.getOffset()[2], ps.getOffset()[2])); { PointInfo pi = ps.getPointInfo(); output(String.Format(" Number of Channels: {0}\n", ps.getNumChannels())); output(" Supported Fields: "); for (uint i = 0; i < pi.getNumChannels(); i += 1) { output(" " + pi.getChannel(i).getName()); } output("\n"); } output(String.Format(" Spatial Reference: {0}\n", ps.getWKT())); if (true /*options.metadata*/) { Metadata meta = new Metadata(); ps.loadMetadata(meta, false); if (meta.getNumRecords() != 0) { output(String.Format(" Metadata: {0}\n", meta.getNumRecords())); for (uint i = 0; i < meta.getNumRecords(); i += 1) { output(String.Format(" {0} ({1}):\n", meta.getKey(i), meta.getDescription(i))); switch (meta.getDataType(i)) { case MetadataDataType.METADATA_DATATYPE_STRING: output(String.Format(" '{0}'\n", meta.getValue(i))); break; case MetadataDataType.METADATA_DATATYPE_BLOB: output(String.Format(" (blob of {0} bytes)\n", meta.getValueLength(i))); break; case MetadataDataType.METADATA_DATATYPE_REAL_ARRAY: output(String.Format(" {{")); double[] values = (double [])meta.getValue(i); for (uint j = 0; j < meta.getValueLength(i); j += 1) { output(String.Format(" {0}", values[j])); } output(String.Format(" }}\n")); break; } } } else { output(" Metadata: None\n"); } if (ps.getNumClassIdNames() != 0) { output(String.Format(" ClassId Names: {0}\n", ps.getNumClassIdNames())); foreach (string name in ps.getClassIdNames()) { output(String.Format(" {0}\n", name)); } } else { output(" ClassId Names: None\n"); } } if (true /*options.bounds*/) { PointInfo pi = new PointInfo(); pi.init(3); pi.getChannel(0).init(ps.getChannel(LidarDSDK.CHANNEL_NAME_X)); pi.getChannel(1).init(ps.getChannel(LidarDSDK.CHANNEL_NAME_Y)); pi.getChannel(2).init(ps.getChannel(LidarDSDK.CHANNEL_NAME_Z)); PointData buffer = new PointData(); buffer.init(pi, 4096); ChannelData x = buffer.getChannel(0); ChannelData y = buffer.getChannel(1); ChannelData z = buffer.getChannel(2); UInt64 numPoints = 0; PointIterator iter = ps.createIterator(Bounds.Huge(), 1.0, pi, null); Bounds bounds = new Bounds(); uint count = iter.getNextPoints(buffer); while (count != 0) { numPoints += count; for (uint i = 0; i < count; i += 1) { bounds.grow(x.getValue(i), y.getValue(i), z.getValue(i)); } count = iter.getNextPoints(buffer); } Bounds b = bounds; output(String.Format(" # of Points Read: {0}\n", numPoints)); output("Real Bounds:\n"); output(String.Format(" Bounds Min: {0} {1} {2}\n", b.x.min, b.y.min, b.z.min)); output(String.Format(" Bounds Max: {0} {1} {2}\n", b.x.max, b.y.max, b.z.max)); } } }