PointLocation.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import Location from '../geom/Location'
  2. import hasInterface from '../../../../hasInterface'
  3. import Coordinate from '../geom/Coordinate'
  4. import CoordinateSequence from '../geom/CoordinateSequence'
  5. import RobustLineIntersector from './RobustLineIntersector'
  6. import RayCrossingCounter from './RayCrossingCounter'
  7. export default class PointLocation {
  8. static isOnLine() {
  9. if (arguments[0] instanceof Coordinate && hasInterface(arguments[1], CoordinateSequence)) {
  10. const p = arguments[0], line = arguments[1]
  11. const lineIntersector = new RobustLineIntersector()
  12. const p0 = new Coordinate()
  13. const p1 = new Coordinate()
  14. const n = line.size()
  15. for (let i = 1; i < n; i++) {
  16. line.getCoordinate(i - 1, p0)
  17. line.getCoordinate(i, p1)
  18. lineIntersector.computeIntersection(p, p0, p1)
  19. if (lineIntersector.hasIntersection())
  20. return true
  21. }
  22. return false
  23. } else if (arguments[0] instanceof Coordinate && arguments[1] instanceof Array) {
  24. const p = arguments[0], line = arguments[1]
  25. const lineIntersector = new RobustLineIntersector()
  26. for (let i = 1; i < line.length; i++) {
  27. const p0 = line[i - 1]
  28. const p1 = line[i]
  29. lineIntersector.computeIntersection(p, p0, p1)
  30. if (lineIntersector.hasIntersection())
  31. return true
  32. }
  33. return false
  34. }
  35. }
  36. static locateInRing(p, ring) {
  37. return RayCrossingCounter.locatePointInRing(p, ring)
  38. }
  39. static isInRing(p, ring) {
  40. return PointLocation.locateInRing(p, ring) !== Location.EXTERIOR
  41. }
  42. }