SweepLineIndex.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import SweepLineEvent from './SweepLineEvent'
  2. import Collections from '../../../../../java/util/Collections'
  3. import ArrayList from '../../../../../java/util/ArrayList'
  4. export default class SweepLineIndex {
  5. constructor() {
  6. SweepLineIndex.constructor_.apply(this, arguments)
  7. }
  8. static constructor_() {
  9. this.events = new ArrayList()
  10. this._indexBuilt = null
  11. this._nOverlaps = null
  12. }
  13. computeOverlaps(action) {
  14. this._nOverlaps = 0
  15. this.buildIndex()
  16. for (let i = 0; i < this.events.size(); i++) {
  17. const ev = this.events.get(i)
  18. if (ev.isInsert())
  19. this.processOverlaps(i, ev.getDeleteEventIndex(), ev.getInterval(), action)
  20. }
  21. }
  22. processOverlaps(start, end, s0, action) {
  23. for (let i = start; i < end; i++) {
  24. const ev = this.events.get(i)
  25. if (ev.isInsert()) {
  26. const s1 = ev.getInterval()
  27. action.overlap(s0, s1)
  28. this._nOverlaps++
  29. }
  30. }
  31. }
  32. buildIndex() {
  33. if (this._indexBuilt) return null
  34. Collections.sort(this.events)
  35. for (let i = 0; i < this.events.size(); i++) {
  36. const ev = this.events.get(i)
  37. if (ev.isDelete())
  38. ev.getInsertEvent().setDeleteEventIndex(i)
  39. }
  40. this._indexBuilt = true
  41. }
  42. add(sweepInt) {
  43. const insertEvent = new SweepLineEvent(sweepInt.getMin(), null, sweepInt)
  44. this.events.add(insertEvent)
  45. this.events.add(new SweepLineEvent(sweepInt.getMax(), insertEvent, sweepInt))
  46. }
  47. }