3597{
3598
3601 double furthest_angle = 0.0;
3602 double cap_angle = 0.0;
3604 double lon0 = -M_PI, lon1 = M_PI;
3605 double lat0, lat1;
3607
3608 if (!gbox_geocentric || !gbox_planar)
3609 {
3610 lwerror(
"Null pointer passed to %s", __func__);
3612 }
3613
3614#define CORNER_SET(ii, xx, yy, zz) { \
3615 corners[ii].x = gbox_geocentric->xx; \
3616 corners[ii].y = gbox_geocentric->yy; \
3617 corners[ii].z = gbox_geocentric->zz; \
3618 }
3619
3620
3621
3622
3623
3632
3633
3634
3635
3636
3637 for (uint32_t i = 0; i < 8; i++)
3638 {
3640 cap_center.
x += corners[i].
x;
3641 cap_center.
y += corners[i].
y;
3642 cap_center.
z += corners[i].
z;
3643 }
3645
3646
3647
3648
3649
3650
3651 for (uint32_t i = 0; i < 8; i++)
3652 {
3653 double angle =
vector_angle(&cap_center, &(corners[i]));
3654 if (angle > furthest_angle)
3655 furthest_angle = angle;
3656 }
3657 cap_angle = furthest_angle;
3658
3659
3660
3661
3662
3664
3665
3666 lat0 = cap_center_g.
lat - cap_angle;
3667 if (lat0 <= -M_PI_2)
3668 {
3669 lat0 = -M_PI_2;
3671 }
3672
3673
3674 lat1 = cap_center_g.
lat + cap_angle;
3675 if (lat1 >= M_PI_2)
3676 {
3677 lat1 = M_PI_2;
3679 }
3680
3681 if (!all_longitudes)
3682 {
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694 double sin_a = sin(cap_angle);
3695 double sin_c = cos(cap_center_g.
lat);
3696 if (sin_a <= sin_c)
3697 {
3698 double angle_A = asin(sin_a / sin_c);
3699 lon0 = remainder(cap_center_g.
lon - angle_A, 2 * M_PI);
3700 lon1 = remainder(cap_center_g.
lon + angle_A, 2 * M_PI);
3701 }
3702 else
3703 {
3704 lon0 = -M_PI;
3705 lon1 = M_PI;
3706 }
3707 }
3708
3716
3718}
#define FLAGS_SET_GEODETIC(flags, value)
#define LW_TRUE
Return types for functions with status returns.
#define FLAGS_SET_M(flags, value)
#define FLAGS_SET_Z(flags, value)
void normalize(POINT3D *p)
Normalize to a unit vector.
void cart2geog(const POINT3D *p, GEOGRAPHIC_POINT *g)
Convert cartesian coordinates on unit sphere to spherical coordinates.
#define CORNER_SET(ii, xx, yy, zz)
double vector_angle(const POINT3D *v1, const POINT3D *v2)
Angle between two unit vectors.
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
Point in spherical coordinates on the world.