public void add(SweepLineInterval sweepInt) { SweepLineEvent insertEvent = new SweepLineEvent(sweepInt.getMin(), null, sweepInt); events.add(insertEvent); events.add(new SweepLineEvent(sweepInt.getMax(), insertEvent, sweepInt)); }
public void computeOverlaps(SweepLineOverlapAction action) { nOverlaps = 0; buildIndex(); for (int i = 0; i < events.size(); i++ ) { SweepLineEvent ev = (SweepLineEvent) events.get(i); if (ev.isInsert()) { processOverlaps(i, ev.getDeleteEventIndex(), ev.getInterval(), action); } } }
private void processOverlaps(int start, int end, SweepLineInterval s0, SweepLineOverlapAction action) { /** * Since we might need to test for self-intersections, * include current insert event object in list of event objects to test. * Last index can be skipped, because it must be a Delete event. */ for (int i = start; i < end; i++ ) { SweepLineEvent ev = (SweepLineEvent) events.get(i); if (ev.isInsert()) { SweepLineInterval s1 = ev.getInterval(); action.overlap(s0, s1); nOverlaps++; } } }
/** * Because Delete Events have a link to their corresponding Insert event, * it is possible to compute exactly the range of events which must be * compared to a given Insert event object. */ private void buildIndex() { if (indexBuilt) return; Collections.sort(events); for (int i = 0; i < events.size(); i++ ) { SweepLineEvent ev = (SweepLineEvent) events.get(i); if (ev.isDelete()) { ev.getInsertEvent().setDeleteEventIndex(i); } } indexBuilt = true; }
private void buildIndex() { sweepLine = new SweepLineIndex(); for (int i = 0; i < rings.size(); i++) { LinearRing ring = (LinearRing) rings.get(i); Envelope env = ring.getEnvelopeInternal(); SweepLineInterval sweepInt = new SweepLineInterval(env.getMinX(), env.getMaxX(), ring); sweepLine.add(sweepInt); } }
public boolean isNonNested() { buildIndex(); OverlapAction action = new OverlapAction(); sweepLine.computeOverlaps(action); return action.isNonNested; }