Area.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import hasInterface from '../../../../hasInterface'
  2. import Coordinate from '../geom/Coordinate'
  3. import CoordinateSequence from '../geom/CoordinateSequence'
  4. export default class Area {
  5. static ofRing() {
  6. if (arguments[0] instanceof Array) {
  7. const ring = arguments[0]
  8. return Math.abs(Area.ofRingSigned(ring))
  9. } else if (hasInterface(arguments[0], CoordinateSequence)) {
  10. const ring = arguments[0]
  11. return Math.abs(Area.ofRingSigned(ring))
  12. }
  13. }
  14. static ofRingSigned() {
  15. if (arguments[0] instanceof Array) {
  16. const ring = arguments[0]
  17. if (ring.length < 3) return 0.0
  18. let sum = 0.0
  19. const x0 = ring[0].x
  20. for (let i = 1; i < ring.length - 1; i++) {
  21. const x = ring[i].x - x0
  22. const y1 = ring[i + 1].y
  23. const y2 = ring[i - 1].y
  24. sum += x * (y2 - y1)
  25. }
  26. return sum / 2.0
  27. } else if (hasInterface(arguments[0], CoordinateSequence)) {
  28. const ring = arguments[0]
  29. const n = ring.size()
  30. if (n < 3) return 0.0
  31. const p0 = new Coordinate()
  32. const p1 = new Coordinate()
  33. const p2 = new Coordinate()
  34. ring.getCoordinate(0, p1)
  35. ring.getCoordinate(1, p2)
  36. const x0 = p1.x
  37. p2.x -= x0
  38. let sum = 0.0
  39. for (let i = 1; i < n - 1; i++) {
  40. p0.y = p1.y
  41. p1.x = p2.x
  42. p1.y = p2.y
  43. ring.getCoordinate(i + 1, p2)
  44. p2.x -= x0
  45. sum += p1.x * (p0.y - p2.y)
  46. }
  47. return sum / 2.0
  48. }
  49. }
  50. }