} // public void ComputeOverlaps( MonotoneChain mc, MonotoneChainOverlapAction mco ) private void ComputeOverlaps( int start0, int end0, MonotoneChain mc, int start1, int end1, MonotoneChainOverlapAction mco) { Coordinate p00 = _pts[start0]; Coordinate p01 = _pts[end0]; Coordinate p10 = mc.GetCoordinates()[start1]; Coordinate p11 = mc.GetCoordinates()[end1]; //Trace.WriteLine( "ComputeIntersectsForChain:" + p00.ToString() + p01.ToString() + p10.ToString() + p11.ToString() ); // terminating condition for the recursion if (end0 - start0 == 1 && end1 - start1 == 1) { mco.Overlap(this, start0, mc, start1); return; } // nothing to do if the envelopes of these chains don't overlap _env1.Initialize(p00, p01); _env2.Initialize(p10, p11); if (!_env1.Intersects(_env2)) { return; } // the chains overlap, so split each in half and iterate (binary search) int mid0 = (start0 + end0) / 2; int mid1 = (start1 + end1) / 2; // Assert: mid != start or end (since we checked above for end - start <= 1) // check terminating conditions before recursing if (start0 < mid0) { if (start1 < mid1) { ComputeOverlaps(start0, mid0, mc, start1, mid1, mco); } if (mid1 < end1) { ComputeOverlaps(start0, mid0, mc, mid1, end1, mco); } } // if ( start0 < mid0 ) if (mid0 < end0) { if (start1 < mid1) { ComputeOverlaps(mid0, end0, mc, start1, mid1, mco); } if (mid1 < end1) { ComputeOverlaps(mid0, end0, mc, mid1, end1, mco); } } // if ( mid0 < end0 ) } // private void ComputeOverlaps(...
} // public void ComputeOverlaps( MonotoneChain mc, MonotoneChainOverlapAction mco ) private void ComputeOverlaps( int start0, int end0, MonotoneChain mc, int start1, int end1, MonotoneChainOverlapAction mco) { Coordinate p00 = _pts[start0]; Coordinate p01 = _pts[end0]; Coordinate p10 = mc.GetCoordinates()[start1]; Coordinate p11 = mc.GetCoordinates()[end1]; //Trace.WriteLine( "ComputeIntersectsForChain:" + p00.ToString() + p01.ToString() + p10.ToString() + p11.ToString() ); // terminating condition for the recursion if ( end0 - start0 == 1 && end1 - start1 == 1 ) { mco.Overlap( this, start0, mc, start1 ); return; } // nothing to do if the envelopes of these chains don't overlap _env1.Initialize( p00, p01 ); _env2.Initialize( p10, p11 ); if ( !_env1.Intersects( _env2 ) ) return; // the chains overlap, so split each in half and iterate (binary search) int mid0 = ( start0 + end0 ) / 2; int mid1 = ( start1 + end1 ) / 2; // Assert: mid != start or end (since we checked above for end - start <= 1) // check terminating conditions before recursing if ( start0 < mid0 ) { if ( start1 < mid1 ) { ComputeOverlaps( start0, mid0, mc, start1, mid1, mco ); } if (mid1 < end1) { ComputeOverlaps( start0, mid0, mc, mid1, end1, mco ); } } // if ( start0 < mid0 ) if ( mid0 < end0 ) { if ( start1 < mid1 ) { ComputeOverlaps(mid0, end0, mc, start1, mid1, mco); } if ( mid1 < end1 ) { ComputeOverlaps(mid0, end0, mc, mid1, end1, mco); } } // if ( mid0 < end0 ) } // private void ComputeOverlaps(...
} // private void ComputeSelect(... /// <summary> /// /// </summary> /// <param name="mc"></param> /// <param name="mco"></param> public void ComputeOverlaps( MonotoneChain mc, MonotoneChainOverlapAction mco ) { ComputeOverlaps( _start, _end, mc, mc.StartIndex, mc.EndIndex, mco ); } // public void ComputeOverlaps( MonotoneChain mc, MonotoneChainOverlapAction mco )
} // private void ComputeSelect(... /// <summary> /// /// </summary> /// <param name="mc"></param> /// <param name="mco"></param> public void ComputeOverlaps(MonotoneChain mc, MonotoneChainOverlapAction mco) { ComputeOverlaps(_start, _end, mc, mc.StartIndex, mc.EndIndex, mco); } // public void ComputeOverlaps( MonotoneChain mc, MonotoneChainOverlapAction mco )