PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ edge_calculate_gbox_slow()

int edge_calculate_gbox_slow ( const GEOGRAPHIC_EDGE e,
GBOX gbox 
)

Definition at line 1298 of file lwgeodetic.c.

1299{
1300 int steps = 1000000;
1301 int i;
1302 double dx, dy, dz;
1303 double distance = sphere_distance(&(e->start), &(e->end));
1304 POINT3D pn, p, start, end;
1305
1306 /* Edge is zero length, just return the naive box */
1307 if ( FP_IS_ZERO(distance) )
1308 {
1309 LWDEBUG(4, "edge is zero length. returning");
1310 geog2cart(&(e->start), &start);
1311 geog2cart(&(e->end), &end);
1312 gbox_init_point3d(&start, gbox);
1313 gbox_merge_point3d(&end, gbox);
1314 return LW_SUCCESS;
1315 }
1316
1317 /* Edge is antipodal (one point on each side of the globe),
1318 set the box to contain the whole world and return */
1319 if ( FP_EQUALS(distance, M_PI) )
1320 {
1321 LWDEBUG(4, "edge is antipodal. setting to maximum size box, and returning");
1322 gbox->xmin = gbox->ymin = gbox->zmin = -1.0;
1323 gbox->xmax = gbox->ymax = gbox->zmax = 1.0;
1324 return LW_SUCCESS;
1325 }
1326
1327 /* Walk along the chord between start and end incrementally,
1328 normalizing at each step. */
1329 geog2cart(&(e->start), &start);
1330 geog2cart(&(e->end), &end);
1331 dx = (end.x - start.x)/steps;
1332 dy = (end.y - start.y)/steps;
1333 dz = (end.z - start.z)/steps;
1334 p = start;
1335 gbox->xmin = gbox->xmax = p.x;
1336 gbox->ymin = gbox->ymax = p.y;
1337 gbox->zmin = gbox->zmax = p.z;
1338 for ( i = 0; i < steps; i++ )
1339 {
1340 p.x += dx;
1341 p.y += dy;
1342 p.z += dz;
1343 pn = p;
1344 normalize(&pn);
1345 gbox_merge_point3d(&pn, gbox);
1346 }
1347 return LW_SUCCESS;
1348}
int gbox_merge_point3d(const POINT3D *p, GBOX *gbox)
Update the GBOX to be large enough to include itself and the new point.
Definition gbox.c:228
int gbox_init_point3d(const POINT3D *p, GBOX *gbox)
Initialize a GBOX using the values of the point.
Definition gbox.c:239
#define LW_SUCCESS
Definition liblwgeom.h:97
#define FP_EQUALS(A, B)
#define FP_IS_ZERO(A)
void normalize(POINT3D *p)
Normalize to a unit vector.
Definition lwgeodetic.c:615
double sphere_distance(const GEOGRAPHIC_POINT *s, const GEOGRAPHIC_POINT *e)
Given two points on a unit sphere, calculate their distance apart in radians.
Definition lwgeodetic.c:896
void geog2cart(const GEOGRAPHIC_POINT *g, POINT3D *p)
Convert spherical coordinates to cartesian coordinates on unit sphere.
Definition lwgeodetic.c:404
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
static double distance(double x1, double y1, double x2, double y2)
Definition lwtree.c:1032
double ymax
Definition liblwgeom.h:357
double zmax
Definition liblwgeom.h:359
double xmax
Definition liblwgeom.h:355
double zmin
Definition liblwgeom.h:358
double ymin
Definition liblwgeom.h:356
double xmin
Definition liblwgeom.h:354
GEOGRAPHIC_POINT start
Definition lwgeodetic.h:64
GEOGRAPHIC_POINT end
Definition lwgeodetic.h:65
double z
Definition liblwgeom.h:402
double x
Definition liblwgeom.h:402
double y
Definition liblwgeom.h:402

References distance(), GEOGRAPHIC_EDGE::end, FP_EQUALS, FP_IS_ZERO, gbox_init_point3d(), gbox_merge_point3d(), geog2cart(), LW_SUCCESS, LWDEBUG, normalize(), sphere_distance(), GEOGRAPHIC_EDGE::start, POINT3D::x, GBOX::xmax, GBOX::xmin, POINT3D::y, GBOX::ymax, GBOX::ymin, POINT3D::z, GBOX::zmax, and GBOX::zmin.

Here is the call graph for this function: