MonotoneChainIndexer.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import IntArrayList from '../../util/IntArrayList'
  2. import ArrayList from '../../../../../java/util/ArrayList'
  3. import Quadrant from '../Quadrant'
  4. export default class MonotoneChainIndexer {
  5. static toIntArray(list) {
  6. const array = new Array(list.size()).fill(null)
  7. for (let i = 0; i < array.length; i++)
  8. array[i] = list.get(i).intValue()
  9. return array
  10. }
  11. getChainStartIndices(pts) {
  12. let start = 0
  13. const startIndexList = new IntArrayList(Math.trunc(pts.length / 2))
  14. startIndexList.add(start)
  15. do {
  16. const last = this.findChainEnd(pts, start)
  17. startIndexList.add(last)
  18. start = last
  19. } while (start < pts.length - 1)
  20. return startIndexList.toArray()
  21. }
  22. findChainEnd(pts, start) {
  23. const chainQuad = Quadrant.quadrant(pts[start], pts[start + 1])
  24. let last = start + 1
  25. while (last < pts.length) {
  26. const quad = Quadrant.quadrant(pts[last - 1], pts[last])
  27. if (quad !== chainQuad) break
  28. last++
  29. }
  30. return last - 1
  31. }
  32. OLDgetChainStartIndices(pts) {
  33. let start = 0
  34. const startIndexList = new ArrayList()
  35. startIndexList.add(start)
  36. do {
  37. const last = this.findChainEnd(pts, start)
  38. startIndexList.add(last)
  39. start = last
  40. } while (start < pts.length - 1)
  41. const startIndex = MonotoneChainIndexer.toIntArray(startIndexList)
  42. return startIndex
  43. }
  44. }