MonotoneChainBuilder.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import MonotoneChain from './MonotoneChain'
  2. import ArrayList from '../../../../../java/util/ArrayList'
  3. import Quadrant from '../../geomgraph/Quadrant'
  4. export default class MonotoneChainBuilder {
  5. static findChainEnd(pts, start) {
  6. let safeStart = start
  7. while (safeStart < pts.length - 1 && pts[safeStart].equals2D(pts[safeStart + 1]))
  8. safeStart++
  9. if (safeStart >= pts.length - 1)
  10. return pts.length - 1
  11. const chainQuad = Quadrant.quadrant(pts[safeStart], pts[safeStart + 1])
  12. let last = start + 1
  13. while (last < pts.length) {
  14. if (!pts[last - 1].equals2D(pts[last])) {
  15. const quad = Quadrant.quadrant(pts[last - 1], pts[last])
  16. if (quad !== chainQuad) break
  17. }
  18. last++
  19. }
  20. return last - 1
  21. }
  22. static getChains() {
  23. if (arguments.length === 1) {
  24. const pts = arguments[0]
  25. return MonotoneChainBuilder.getChains(pts, null)
  26. } else if (arguments.length === 2) {
  27. const pts = arguments[0], context = arguments[1]
  28. const mcList = new ArrayList()
  29. let chainStart = 0
  30. do {
  31. const chainEnd = MonotoneChainBuilder.findChainEnd(pts, chainStart)
  32. const mc = new MonotoneChain(pts, chainStart, chainEnd, context)
  33. mcList.add(mc)
  34. chainStart = chainEnd
  35. } while (chainStart < pts.length - 1)
  36. return mcList
  37. }
  38. }
  39. }