22 #include <geos/export.h>
23 #include <geos/geom/Coordinate.h>
38 GEOS_DLL std::ostream& operator<< (std::ostream& os,
const Envelope& o);
63 friend std::ostream& operator<< (std::ostream& os,
const Envelope& o);
65 typedef std::unique_ptr<Envelope> Ptr;
71 : minx(DoubleNotANumber)
72 , maxx(DoubleNotANumber)
73 , miny(DoubleNotANumber)
74 , maxy(DoubleNotANumber)
85 Envelope(
double x1,
double x2,
double y1,
double y2)
96 Envelope(
const CoordinateXY& p1,
const CoordinateXY& p2)
129 static bool intersects(
const CoordinateXY& p1,
const CoordinateXY& p2,
130 const CoordinateXY& q);
144 const CoordinateXY& p1,
const CoordinateXY& p2,
145 const CoordinateXY& q1,
const CoordinateXY& q2)
147 double minq = std::min(q1.x, q2.x);
148 double maxq = std::max(q1.x, q2.x);
149 double minp = std::min(p1.x, p2.x);
150 double maxp = std::max(p1.x, p2.x);
157 minq = std::min(q1.y, q2.y);
158 maxq = std::max(q1.y, q2.y);
159 minp = std::min(p1.y, p2.y);
160 maxp = std::max(p1.y, p2.y);
178 bool intersects(
const CoordinateXY& a,
const CoordinateXY& b)
const;
196 void init(
double x1,
double x2,
double y1,
double y2)
222 void init(
const CoordinateXY& p1,
const CoordinateXY& p2)
224 init(p1.x, p2.x, p1.y, p2.y);
232 void init(
const CoordinateXY& p)
234 init(p.x, p.x, p.y, p.y);
243 minx = maxx = miny = maxy = DoubleNotANumber;
254 return std::isnan(maxx);
292 return getWidth() * getHeight();
301 return std::isfinite(getArea());
354 double w = getWidth();
355 double h = getHeight();
356 return std::sqrt(w*w + h*h);
406 expandBy(p_distance, p_distance);
417 expandToInclude(p.x, p.y);
470 if(std::isless(other->minx, minx)) {
473 if(std::isgreater(other->maxx, maxx)) {
476 if(std::isless(other->miny, miny)) {
479 if(std::isgreater(other->maxy, maxy)) {
485 void expandToInclude(
const Envelope& other)
487 return expandToInclude(&other);
505 return covers(other);
509 contains(
const Envelope* other)
const
511 return contains(*other);
524 return covers(p.x, p.y);
551 return (std::islessequal(other.x, maxx) && std::isgreaterequal(other.x, minx) &&
552 std::islessequal(other.y, maxy) && std::isgreaterequal(other.y, miny));
564 return std::islessequal(x, maxx) &&
565 std::isgreaterequal(x, minx) &&
566 std::islessequal(y, maxy) &&
567 std::isgreaterequal(y, miny);
578 return std::islessequal(other->minx, maxx) &&
579 std::isgreaterequal(other->maxx, minx) &&
580 std::islessequal(other->miny, maxy) &&
581 std::isgreaterequal(other->maxy, miny);
584 bool intersects(
const Envelope& other)
const
586 return intersects(&other);
598 return !intersects(other);
601 bool disjoint(
const Envelope* other)
const
603 return !intersects(other);
614 return std::isgreaterequal(x, minx) &&
615 std::islessequal(x, maxx) &&
616 std::isgreaterequal(y, miny) &&
617 std::islessequal(y, maxy);
628 return covers(p->x, p->y);
642 return covers(*other);
676 return std::sqrt(distanceSquared(env));
684 Coordinate p(std::min(minx, other.minx), std::min(miny, other.miny));
685 Coordinate q(std::max(maxx, other.maxx), std::max(maxy, other.maxy));
686 return p.distance(q);
697 double dx = std::max(0.0,
698 std::max(maxx, env.maxx) - std::min(minx, env.minx) - (maxx - minx) -
699 (env.maxx - env.minx));
700 double dy = std::max(0.0,
701 std::max(maxy, env.maxy) - std::min(miny, env.miny) - (maxy - miny) -
702 (env.maxy - env.miny));
704 return dx * dx + dy * dy;
717 const CoordinateXY& c,
718 const CoordinateXY& p0,
719 const CoordinateXY& p1)
721 return std::sqrt(distanceSquaredToCoordinate(c, p0, p1));
734 const CoordinateXY& c,
735 const CoordinateXY& p0,
736 const CoordinateXY& p1)
738 double xa = c.x - p0.x;
739 double xb = c.x - p1.x;
740 double ya = c.y - p0.y;
741 double yb = c.y - p1.y;
744 double dx = (std::signbit(xa) == std::signbit(xb)) * std::min(std::abs(xa), std::abs(xb));
745 double dy = (std::signbit(ya) == std::signbit(yb)) * std::min(std::abs(ya), std::abs(yb));
747 return dx*dx + dy*dy;
750 std::size_t hashCode()
const
752 auto hash = std::hash<double>{};
755 std::size_t result = 17;
756 result = 37 * result + hash(minx);
757 result = 37 * result + hash(maxx);
758 result = 37 * result + hash(miny);
759 result = 37 * result + hash(maxy);
763 struct GEOS_DLL HashCode
765 std::size_t operator()(
const Envelope& e)
const
799 static std::vector<std::string> split(
const std::string& str,
800 const std::string& delimiters =
" ");
802 static double distance(
double x0,
double y0,
double x1,
double y1)
806 return std::sqrt(dx * dx + dy * dy);
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:217
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition: Envelope.h:59
double getMinX() const
Returns the Envelope minimum x-value. Null envelopes do not have maximum values.
Definition: Envelope.h:338
void expandToInclude(const CoordinateXY &p)
Enlarges the boundary of the Envelope so that it contains p. Does nothing if p is already on or withi...
Definition: Envelope.h:415
bool contains(const CoordinateXY &p) const
Returns true if the given point lies in or on the envelope.
Definition: Envelope.h:522
bool intersection(const Envelope &env, Envelope &result) const
Computes the intersection of two Envelopes.
double distanceSquared(const Envelope &env) const
Computes the square of the distance between this and another Envelope.
Definition: Envelope.h:695
bool contains(const Envelope &other) const
Tests if the Envelope other lies wholly inside this Envelope (inclusive of the boundary).
Definition: Envelope.h:503
void expandToInclude(double x, double y)
Enlarges the boundary of the Envelope so that it contains (x,y).
Definition: Envelope.h:430
bool intersects(double x, double y) const
Check if the point (x, y) intersects (lies inside) the region of this Envelope.
Definition: Envelope.h:562
double getDiameter() const
Definition: Envelope.h:349
bool equals(const Envelope *other) const
Returns true if the Envelope other spatially equals this Envelope.
void setToNull()
Makes this Envelope a "null" envelope, that is, the envelope of the empty geometry.
Definition: Envelope.h:241
bool covers(double x, double y) const
Tests if the given point lies in or on the envelope.
Definition: Envelope.h:613
bool centre(CoordinateXY ¢re) const
Computes the coordinate of the centre of this envelope (as long as it is non-null).
double distance(const Envelope &env) const
Computes the distance between this and another Envelope.
Definition: Envelope.h:674
static double distanceToCoordinate(const CoordinateXY &c, const CoordinateXY &p0, const CoordinateXY &p1)
Computes the distance between one Coordinate and an Envelope defined by two other Coordinates....
Definition: Envelope.h:716
double getArea() const
Gets the area of this envelope.
Definition: Envelope.h:290
void init(const CoordinateXY &p1, const CoordinateXY &p2)
Initialize an Envelope to a region defined by two Coordinates.
Definition: Envelope.h:222
void expandBy(double deltaX, double deltaY)
Expands this envelope by a given distance in all directions. Both positive and negative distances are...
void init(double x1, double x2, double y1, double y2)
Initialize an Envelope for a region defined by maximum and minimum values.
Definition: Envelope.h:196
static bool intersects(const CoordinateXY &p1, const CoordinateXY &p2, const CoordinateXY &q)
Test the point q to see whether it intersects the Envelope defined by p1-p2.
bool contains(double x, double y) const
Returns true if the given point lies in or on the envelope.
Definition: Envelope.h:538
double getHeight() const
Returns the difference between the maximum and minimum y values.
Definition: Envelope.h:275
Envelope()
Creates a null Envelope.
Definition: Envelope.h:70
Envelope(const std::string &str)
Create an Envelope from an Envelope string representation produced by Envelope::toString()
bool isFinite() const
Returns true if this Envelope covers a finite region.
Definition: Envelope.h:299
double getWidth() const
Returns the difference between the maximum and minimum x values.
Definition: Envelope.h:262
double getMaxX() const
Returns the Envelope maximum x-value. Null envelopes do not have maximum values.
Definition: Envelope.h:318
bool intersects(const CoordinateXY &a, const CoordinateXY &b) const
Check if the extent defined by two extremal points intersects the extent of this Envelope.
double getMaxY() const
Returns the Envelope maximum y-value. Null envelopes do not have maximum values.
Definition: Envelope.h:308
bool isNull(void) const
Returns true if this Envelope is a "null" envelope.
Definition: Envelope.h:252
void init(const CoordinateXY &p)
Initialize an Envelope to a region defined by a single Coordinate.
Definition: Envelope.h:232
void expandBy(double p_distance)
Expands this envelope by a given distance in all directions.
Definition: Envelope.h:404
bool covers(const CoordinateXY *p) const
Tests if the given point lies in or on the envelope.
Definition: Envelope.h:626
void expandToInclude(const Envelope *other)
Enlarges the boundary of the Envelope so that it contains other.
Definition: Envelope.h:461
static bool intersects(const CoordinateXY &p1, const CoordinateXY &p2, const CoordinateXY &q1, const CoordinateXY &q2)
Test the envelope defined by p1-p2 for intersection with the envelope defined by q1-q2.
Definition: Envelope.h:143
Envelope(const CoordinateXY &p)
Creates an Envelope for a region defined by a single Coordinate.
Definition: Envelope.h:106
bool disjoint(const Envelope &other) const
Definition: Envelope.h:596
void init()
Initialize to a null Envelope.
Definition: Envelope.h:183
friend bool operator==(const Envelope &a, const Envelope &b)
Checks if two Envelopes are equal (2D only check)
Definition: Envelope.h:774
Envelope(const CoordinateXY &p1, const CoordinateXY &p2)
Creates an Envelope for a region defined by two Coordinates.
Definition: Envelope.h:96
std::string toString() const
Returns a string of the form Env[minx:maxx,miny:maxy].
bool intersects(const Envelope *other) const
Check if the region defined by other Envelope intersects the region of this Envelope.
Definition: Envelope.h:576
bool intersects(const CoordinateXY &other) const
Check if the point p intersects (lies inside) the region of this Envelope.
Definition: Envelope.h:549
static double distanceSquaredToCoordinate(const CoordinateXY &c, const CoordinateXY &p0, const CoordinateXY &p1)
Computes the squared distance between one Coordinate and an Envelope defined by two other Coordinates...
Definition: Envelope.h:733
void translate(double transX, double transY)
Translates this envelope by given amounts in the X and Y direction.
bool covers(const Envelope &other) const
Tests if the Envelope other lies wholly inside this Envelope (inclusive of the boundary).
double getMinY() const
Returns the Envelope minimum y-value. Null envelopes do not have maximum values.
Definition: Envelope.h:328
Envelope(double x1, double x2, double y1, double y2)
Creates an Envelope for a region defined by maximum and minimum values.
Definition: Envelope.h:85
double maxDistance(const Envelope &other) const
Computes the maximum distance between points in this and another Envelope.
Definition: Envelope.h:682
bool operator<(const CoordinateXY &a, const CoordinateXY &b)
Strict weak ordering operator for Coordinate.
Definition: Coordinate.h:458
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25