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

◆ gbox_angular_width()

double gbox_angular_width ( const GBOX gbox)

Returns the angular width (longitudinal span) of the box in radians.

Definition at line 215 of file lwgeodetic.c.

216{
217 double d[6];
218 int i, j;
219 POINT3D pt[3];
220 double maxangle;
221 double magnitude;
222
223 /* Take a copy of the box corners so we can treat them as a list */
224 /* Elements are xmin, xmax, ymin, ymax, zmin, zmax */
225 memcpy(d, &(gbox->xmin), 6*sizeof(double));
226
227 /* Start with the bottom corner */
228 pt[0].x = gbox->xmin;
229 pt[0].y = gbox->ymin;
230 magnitude = sqrt(pt[0].x*pt[0].x + pt[0].y*pt[0].y);
231 pt[0].x /= magnitude;
232 pt[0].y /= magnitude;
233
234 /* Generate all 8 corner vectors of the box */
235 /* Find the vector furthest from our seed vector */
236 for ( j = 0; j < 2; j++ )
237 {
238 maxangle = -1 * FLT_MAX;
239 for ( i = 0; i < 4; i++ )
240 {
241 double angle, dotprod;
242 POINT3D pt_n;
243
244 pt_n.x = d[i / 2];
245 pt_n.y = d[2 + (i % 2)];
246 magnitude = sqrt(pt_n.x*pt_n.x + pt_n.y*pt_n.y);
247 pt_n.x /= magnitude;
248 pt_n.y /= magnitude;
249 pt_n.z = 0.0;
250
251 dotprod = pt_n.x*pt[j].x + pt_n.y*pt[j].y;
252 angle = acos(dotprod > 1.0 ? 1.0 : dotprod);
253 if ( angle > maxangle )
254 {
255 pt[j+1] = pt_n;
256 maxangle = angle;
257 }
258 }
259 }
260
261 /* Return the distance between the two furthest vectors */
262 return maxangle;
263}
double ymin
Definition liblwgeom.h:356
double xmin
Definition liblwgeom.h:354
double z
Definition liblwgeom.h:402
double x
Definition liblwgeom.h:402
double y
Definition liblwgeom.h:402

References POINT3D::x, GBOX::xmin, POINT3D::y, GBOX::ymin, and POINT3D::z.

Referenced by geography_bestsrid(), and test_gbox_utils().

Here is the caller graph for this function: