| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- import Coordinate from './Coordinate'
- import Comparable from '../../../../java/lang/Comparable'
- import Serializable from '../../../../java/io/Serializable'
- export default class Envelope {
- constructor() {
- Envelope.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this._minx = null
- this._maxx = null
- this._miny = null
- this._maxy = null
- if (arguments.length === 0) {
- this.init()
- } else if (arguments.length === 1) {
- if (arguments[0] instanceof Coordinate) {
- const p = arguments[0]
- this.init(p.x, p.x, p.y, p.y)
- } else if (arguments[0] instanceof Envelope) {
- const env = arguments[0]
- this.init(env)
- }
- } else if (arguments.length === 2) {
- const p1 = arguments[0], p2 = arguments[1]
- this.init(p1.x, p2.x, p1.y, p2.y)
- } else if (arguments.length === 4) {
- const x1 = arguments[0], x2 = arguments[1], y1 = arguments[2], y2 = arguments[3]
- this.init(x1, x2, y1, y2)
- }
- }
- static intersects() {
- if (arguments.length === 3) {
- const p1 = arguments[0], p2 = arguments[1], q = arguments[2]
- if (q.x >= (p1.x < p2.x ? p1.x : p2.x) && q.x <= (p1.x > p2.x ? p1.x : p2.x) && (q.y >= (p1.y < p2.y ? p1.y : p2.y) && q.y <= (p1.y > p2.y ? p1.y : p2.y)))
- return true
-
- return false
- } else if (arguments.length === 4) {
- const p1 = arguments[0], p2 = arguments[1], q1 = arguments[2], q2 = arguments[3]
- let minq = Math.min(q1.x, q2.x)
- let maxq = Math.max(q1.x, q2.x)
- let minp = Math.min(p1.x, p2.x)
- let maxp = Math.max(p1.x, p2.x)
- if (minp > maxq) return false
- if (maxp < minq) return false
- minq = Math.min(q1.y, q2.y)
- maxq = Math.max(q1.y, q2.y)
- minp = Math.min(p1.y, p2.y)
- maxp = Math.max(p1.y, p2.y)
- if (minp > maxq) return false
- if (maxp < minq) return false
- return true
- }
- }
- getArea() {
- return this.getWidth() * this.getHeight()
- }
- equals(other) {
- if (!(other instanceof Envelope))
- return false
-
- const otherEnvelope = other
- if (this.isNull())
- return otherEnvelope.isNull()
-
- return this._maxx === otherEnvelope.getMaxX() && this._maxy === otherEnvelope.getMaxY() && this._minx === otherEnvelope.getMinX() && this._miny === otherEnvelope.getMinY()
- }
- intersection(env) {
- if (this.isNull() || env.isNull() || !this.intersects(env)) return new Envelope()
- const intMinX = this._minx > env._minx ? this._minx : env._minx
- const intMinY = this._miny > env._miny ? this._miny : env._miny
- const intMaxX = this._maxx < env._maxx ? this._maxx : env._maxx
- const intMaxY = this._maxy < env._maxy ? this._maxy : env._maxy
- return new Envelope(intMinX, intMaxX, intMinY, intMaxY)
- }
- isNull() {
- return this._maxx < this._minx
- }
- getMaxX() {
- return this._maxx
- }
- covers() {
- if (arguments.length === 1) {
- if (arguments[0] instanceof Coordinate) {
- const p = arguments[0]
- return this.covers(p.x, p.y)
- } else if (arguments[0] instanceof Envelope) {
- const other = arguments[0]
- if (this.isNull() || other.isNull())
- return false
-
- return other.getMinX() >= this._minx && other.getMaxX() <= this._maxx && other.getMinY() >= this._miny && other.getMaxY() <= this._maxy
- }
- } else if (arguments.length === 2) {
- const x = arguments[0], y = arguments[1]
- if (this.isNull()) return false
- return x >= this._minx && x <= this._maxx && y >= this._miny && y <= this._maxy
- }
- }
- intersects() {
- if (arguments.length === 1) {
- if (arguments[0] instanceof Envelope) {
- const other = arguments[0]
- if (this.isNull() || other.isNull())
- return false
-
- return !(other._minx > this._maxx || other._maxx < this._minx || other._miny > this._maxy || other._maxy < this._miny)
- } else if (arguments[0] instanceof Coordinate) {
- const p = arguments[0]
- return this.intersects(p.x, p.y)
- }
- } else if (arguments.length === 2) {
- if (arguments[0] instanceof Coordinate && arguments[1] instanceof Coordinate) {
- const a = arguments[0], b = arguments[1]
- if (this.isNull())
- return false
-
- const envminx = a.x < b.x ? a.x : b.x
- if (envminx > this._maxx) return false
- const envmaxx = a.x > b.x ? a.x : b.x
- if (envmaxx < this._minx) return false
- const envminy = a.y < b.y ? a.y : b.y
- if (envminy > this._maxy) return false
- const envmaxy = a.y > b.y ? a.y : b.y
- if (envmaxy < this._miny) return false
- return true
- } else if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {
- const x = arguments[0], y = arguments[1]
- if (this.isNull()) return false
- return !(x > this._maxx || x < this._minx || y > this._maxy || y < this._miny)
- }
- }
- }
- getMinY() {
- return this._miny
- }
- getDiameter() {
- if (this.isNull())
- return 0
-
- const w = this.getWidth()
- const h = this.getHeight()
- return Math.sqrt(w * w + h * h)
- }
- getMinX() {
- return this._minx
- }
- expandToInclude() {
- if (arguments.length === 1) {
- if (arguments[0] instanceof Coordinate) {
- const p = arguments[0]
- this.expandToInclude(p.x, p.y)
- } else if (arguments[0] instanceof Envelope) {
- const other = arguments[0]
- if (other.isNull())
- return null
-
- if (this.isNull()) {
- this._minx = other.getMinX()
- this._maxx = other.getMaxX()
- this._miny = other.getMinY()
- this._maxy = other.getMaxY()
- } else {
- if (other._minx < this._minx)
- this._minx = other._minx
-
- if (other._maxx > this._maxx)
- this._maxx = other._maxx
-
- if (other._miny < this._miny)
- this._miny = other._miny
-
- if (other._maxy > this._maxy)
- this._maxy = other._maxy
-
- }
- }
- } else if (arguments.length === 2) {
- const x = arguments[0], y = arguments[1]
- if (this.isNull()) {
- this._minx = x
- this._maxx = x
- this._miny = y
- this._maxy = y
- } else {
- if (x < this._minx)
- this._minx = x
-
- if (x > this._maxx)
- this._maxx = x
-
- if (y < this._miny)
- this._miny = y
-
- if (y > this._maxy)
- this._maxy = y
-
- }
- }
- }
- minExtent() {
- if (this.isNull()) return 0.0
- const w = this.getWidth()
- const h = this.getHeight()
- if (w < h) return w
- return h
- }
- getWidth() {
- if (this.isNull())
- return 0
-
- return this._maxx - this._minx
- }
- compareTo(o) {
- const env = o
- if (this.isNull()) {
- if (env.isNull()) return 0
- return -1
- } else {
- if (env.isNull()) return 1
- }
- if (this._minx < env._minx) return -1
- if (this._minx > env._minx) return 1
- if (this._miny < env._miny) return -1
- if (this._miny > env._miny) return 1
- if (this._maxx < env._maxx) return -1
- if (this._maxx > env._maxx) return 1
- if (this._maxy < env._maxy) return -1
- if (this._maxy > env._maxy) return 1
- return 0
- }
- translate(transX, transY) {
- if (this.isNull())
- return null
-
- this.init(this.getMinX() + transX, this.getMaxX() + transX, this.getMinY() + transY, this.getMaxY() + transY)
- }
- copy() {
- return new Envelope(this)
- }
- toString() {
- return 'Env[' + this._minx + ' : ' + this._maxx + ', ' + this._miny + ' : ' + this._maxy + ']'
- }
- setToNull() {
- this._minx = 0
- this._maxx = -1
- this._miny = 0
- this._maxy = -1
- }
- disjoint(other) {
- if (this.isNull() || other.isNull())
- return true
-
- return other._minx > this._maxx || other._maxx < this._minx || other._miny > this._maxy || other._maxy < this._miny
- }
- getHeight() {
- if (this.isNull())
- return 0
-
- return this._maxy - this._miny
- }
- maxExtent() {
- if (this.isNull()) return 0.0
- const w = this.getWidth()
- const h = this.getHeight()
- if (w > h) return w
- return h
- }
- expandBy() {
- if (arguments.length === 1) {
- const distance = arguments[0]
- this.expandBy(distance, distance)
- } else if (arguments.length === 2) {
- const deltaX = arguments[0], deltaY = arguments[1]
- if (this.isNull()) return null
- this._minx -= deltaX
- this._maxx += deltaX
- this._miny -= deltaY
- this._maxy += deltaY
- if (this._minx > this._maxx || this._miny > this._maxy) this.setToNull()
- }
- }
- contains() {
- if (arguments.length === 1) {
- if (arguments[0] instanceof Envelope) {
- const other = arguments[0]
- return this.covers(other)
- } else if (arguments[0] instanceof Coordinate) {
- const p = arguments[0]
- return this.covers(p)
- }
- } else if (arguments.length === 2) {
- const x = arguments[0], y = arguments[1]
- return this.covers(x, y)
- }
- }
- centre() {
- if (this.isNull()) return null
- return new Coordinate((this.getMinX() + this.getMaxX()) / 2.0, (this.getMinY() + this.getMaxY()) / 2.0)
- }
- init() {
- if (arguments.length === 0) {
- this.setToNull()
- } else if (arguments.length === 1) {
- if (arguments[0] instanceof Coordinate) {
- const p = arguments[0]
- this.init(p.x, p.x, p.y, p.y)
- } else if (arguments[0] instanceof Envelope) {
- const env = arguments[0]
- this._minx = env._minx
- this._maxx = env._maxx
- this._miny = env._miny
- this._maxy = env._maxy
- }
- } else if (arguments.length === 2) {
- const p1 = arguments[0], p2 = arguments[1]
- this.init(p1.x, p2.x, p1.y, p2.y)
- } else if (arguments.length === 4) {
- const x1 = arguments[0], x2 = arguments[1], y1 = arguments[2], y2 = arguments[3]
- if (x1 < x2) {
- this._minx = x1
- this._maxx = x2
- } else {
- this._minx = x2
- this._maxx = x1
- }
- if (y1 < y2) {
- this._miny = y1
- this._maxy = y2
- } else {
- this._miny = y2
- this._maxy = y1
- }
- }
- }
- getMaxY() {
- return this._maxy
- }
- distance(env) {
- if (this.intersects(env)) return 0
- let dx = 0.0
- if (this._maxx < env._minx) dx = env._minx - this._maxx; else if (this._minx > env._maxx) dx = this._minx - env._maxx
- let dy = 0.0
- if (this._maxy < env._miny) dy = env._miny - this._maxy; else if (this._miny > env._maxy) dy = this._miny - env._maxy
- if (dx === 0.0) return dy
- if (dy === 0.0) return dx
- return Math.sqrt(dx * dx + dy * dy)
- }
- hashCode() {
- let result = 17
- result = 37 * result + Coordinate.hashCode(this._minx)
- result = 37 * result + Coordinate.hashCode(this._maxx)
- result = 37 * result + Coordinate.hashCode(this._miny)
- result = 37 * result + Coordinate.hashCode(this._maxy)
- return result
- }
- get interfaces_() {
- return [Comparable, Serializable]
- }
- }
|