/// <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();
            }
        }
Exemple #2
0
        /// <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);
        }