/// <summary> /// Computes the result of the operation. /// </summary> protected override void ComputeResult() { QuadSegmentCollection result = ResultSegments as QuadSegmentCollection; IList <Segment> segmentList = result.GetSegments().ToList(); // split until all the segments are homogeneous Boolean isHomogeneous = false; Double step = 0; while (!isHomogeneous && step < _numberOfIterations) { isHomogeneous = true; foreach (Segment segment in segmentList) { if (!segment.IsHomogeneous(_splitHomogeneityThreshold) && segment.Count != 1) { isHomogeneous = false; result.SplitQuad(segment); } } step++; segmentList = result.GetSegments().ToList(); } }
/// <summary> /// Computes the result of the operation. /// </summary> protected override void ComputeResult() { QuadSegmentCollection result = ResultSegments as QuadSegmentCollection; IList <Segment> segmentList = result.GetSegments().ToList(); // split until all the segments are homogeneous or the threshold is reached Boolean isHomogeneous = false; Double step = 0; while (!isHomogeneous && step < _numberOfIterations) { isHomogeneous = true; foreach (Segment segment in segmentList) { if (!segment.IsHomogeneous(_splitHomogeneityThreshold)) { isHomogeneous = false; result.SplitQuad(segment); } } step++; segmentList = result.GetSegments().ToList(); } // set the Morton code values segmentList = segmentList.OrderBy(x => x.MortonCode).ToList(); Double maxNumberOfDigits = Math.Floor(Math.Log10(segmentList.Last().MortonCode) + 1); foreach (Segment segment in segmentList) { Int32 numberOfDigits = Convert.ToInt32(Math.Floor(Math.Log10(segment.MortonCode) + 1)); for (Int32 digit = 0; digit < maxNumberOfDigits - numberOfDigits; digit++) { segment.MortonCode = segment.MortonCode * 10 + 1; } } do { isHomogeneous = true; // merge the appropriate segments for (Int32 segmentIndex = 0; segmentIndex < segmentList.Count - 1; segmentIndex++) { // determine the category of the segment Double firstDigit1 = Math.Abs(segmentList[segmentIndex].MortonCode); Double firstDigit2 = Math.Abs(segmentList[segmentIndex + 1].MortonCode); while (firstDigit1 >= 10) { firstDigit1 /= 10; firstDigit2 /= 10; } // merge if possible if (Convert.ToInt32(firstDigit1) != Convert.ToInt32(firstDigit2) && segmentList[segmentIndex].IsMergeHomogenous(segmentList[segmentIndex + 1], _mergeHomogeneityThreshold)) { isHomogeneous = false; Segment mergedSegment = result.MergeSegments(segmentList[segmentIndex], segmentList[segmentIndex + 1]); segmentList.RemoveAt(mergedSegment == segmentList[segmentIndex] ? segmentIndex + 1 : segmentIndex); } } } while (!isHomogeneous); }