use super::*;
use f2rust_std::*;
const SRFIDX: i32 = 1;
const CTRIDX: i32 = (SRFIDX + 1);
const CLSIDX: i32 = (CTRIDX + 1);
const TYPIDX: i32 = (CLSIDX + 1);
const FRMIDX: i32 = (TYPIDX + 1);
const SYSIDX: i32 = (FRMIDX + 1);
const PARIDX: i32 = (SYSIDX + 1);
const NSYPAR: i32 = 10;
const MN1IDX: i32 = (PARIDX + NSYPAR);
const MX1IDX: i32 = (MN1IDX + 1);
const MN2IDX: i32 = (MX1IDX + 1);
const MX2IDX: i32 = (MN2IDX + 1);
const MN3IDX: i32 = (MX2IDX + 1);
const MX3IDX: i32 = (MN3IDX + 1);
const BTMIDX: i32 = (MX3IDX + 1);
const ETMIDX: i32 = (BTMIDX + 1);
const DSKDSZ: i32 = ETMIDX;
const SVFCLS: i32 = 1;
const GENCLS: i32 = 2;
const LATSYS: i32 = 1;
const CYLSYS: i32 = 2;
const RECSYS: i32 = 3;
const PDTSYS: i32 = 4;
const XFRACT: f64 = 0.0000000001;
const KEYXFR: i32 = 1;
const SGREED: f64 = 0.00000001;
const KEYSGR: i32 = (KEYXFR + 1);
const SGPADM: f64 = 0.0000000001;
const KEYSPM: i32 = (KEYSGR + 1);
const PTMEMM: f64 = 0.0000001;
const KEYPTM: i32 = (KEYSPM + 1);
const ANGMRG: f64 = 0.000000000001;
const KEYAMG: i32 = (KEYPTM + 1);
const LONALI: f64 = 0.000000000001;
const KEYLAL: i32 = (KEYAMG + 1);
pub fn ZZPDTBOX(
BOUNDS: &[f64],
CORPAR: &[f64],
CENTER: &mut [f64],
LR: &mut f64,
LT: &mut f64,
LZ: &mut f64,
RADIUS: &mut f64,
ctx: &mut Context,
) -> f2rust_std::Result<()> {
let BOUNDS = DummyArray2D::new(BOUNDS, 1..=2, 1..=3);
let CORPAR = DummyArray::new(CORPAR, 1..);
let mut CENTER = DummyArrayMut::new(CENTER, 1..=3);
let mut BOTV = StackArray::<f64, 3>::new(1..=3);
let mut DIAG = StackArray::<f64, 3>::new(1..=3);
let mut F: f64 = 0.0;
let mut HDLON: f64 = 0.0;
let mut INRAD: f64 = 0.0;
let mut MAXABS: f64 = 0.0;
let mut MAXALT: f64 = 0.0;
let mut MAXLAT: f64 = 0.0;
let mut MAXLON: f64 = 0.0;
let mut MAXV = StackArray::<f64, 3>::new(1..=3);
let mut MAXZ: f64 = 0.0;
let mut MIDLON: f64 = 0.0;
let mut MIDR: f64 = 0.0;
let mut MINALT: f64 = 0.0;
let mut MINLAT: f64 = 0.0;
let mut MINLON: f64 = 0.0;
let mut MINV = StackArray::<f64, 3>::new(1..=3);
let mut MINZ: f64 = 0.0;
let mut OUTRAD: f64 = 0.0;
let mut RE: f64 = 0.0;
let mut TOPV = StackArray::<f64, 3>::new(1..=3);
if RETURN(ctx) {
return Ok(());
}
RE = CORPAR[1];
F = CORPAR[2];
if (RE <= 0.0) {
CHKIN(b"ZZPDTBOX", ctx)?;
SETMSG(b"Equatorial radius from CORPAR array was #.", ctx);
ERRDP(b"#", RE, ctx);
SIGERR(b"SPICE(VALUEOUTOFRANGE)", ctx)?;
CHKOUT(b"ZZPDTBOX", ctx)?;
return Ok(());
}
if (F >= 1.0) {
CHKIN(b"ZZPDTBOX", ctx)?;
SETMSG(b"Flattening coefficient from CORPAR array was #.", ctx);
ERRDP(b"*", F, ctx);
SIGERR(b"SPICE(VALUEOUTOFRANGE)", ctx)?;
CHKOUT(b"ZZPDTBOX", ctx)?;
return Ok(());
}
MINLON = BOUNDS[[1, 1]];
MAXLON = BOUNDS[[2, 1]];
if (MAXLON <= MINLON) {
MAXLON = (MAXLON + TWOPI(ctx));
}
if (MAXLON <= MINLON) {
CHKIN(b"ZZPDTBOX", ctx)?;
SETMSG(
b"Longitude bounds are #:#. Minimum longitude exceeds maximum by more than 2 pi.",
ctx,
);
ERRDP(b"#", MINLON, ctx);
ERRDP(b"#", BOUNDS[[2, 1]], ctx);
SIGERR(b"SPICE(BADLONGITUDERANGE)", ctx)?;
CHKOUT(b"ZZPDTBOX", ctx)?;
return Ok(());
}
MINLAT = BOUNDS[[1, 2]];
MAXLAT = BOUNDS[[2, 2]];
MINALT = BOUNDS[[1, 3]];
MAXALT = BOUNDS[[2, 3]];
if (MINLAT > MAXLAT) {
CHKIN(b"ZZPDTBOX", ctx)?;
SETMSG(b"Latitude bounds #:# are out of order.", ctx);
ERRDP(b"#", MINLAT, ctx);
ERRDP(b"#", MAXLAT, ctx);
SIGERR(b"SPICE(BADLATITUDEBOUNDS)", ctx)?;
CHKOUT(b"ZZPDTBOX", ctx)?;
return Ok(());
}
if (MINLAT < (-HALFPI(ctx) - ANGMRG)) {
CHKIN(b"ZZPDTBOX", ctx)?;
SETMSG(b"Minimum latitude # is less than -pi/2.", ctx);
ERRDP(b"#", MINLAT, ctx);
SIGERR(b"SPICE(BADLATITUDERANGE)", ctx)?;
CHKOUT(b"ZZPDTBOX", ctx)?;
return Ok(());
}
if (MAXLAT > (HALFPI(ctx) + ANGMRG)) {
CHKIN(b"ZZPDTBOX", ctx)?;
SETMSG(b"Maximum latitude # is more than -pi/2.", ctx);
ERRDP(b"#", MAXLAT, ctx);
SIGERR(b"SPICE(BADLATITUDERANGE)", ctx)?;
CHKOUT(b"ZZPDTBOX", ctx)?;
return Ok(());
}
MINLAT = intrinsics::DMAX1(&[MINLAT, -HALFPI(ctx)]);
MAXLAT = intrinsics::DMIN1(&[MAXLAT, HALFPI(ctx)]);
if (MINLAT >= 0.0) {
GEOREC(0.0, MINLAT, MAXALT, RE, F, MAXV.as_slice_mut(), ctx)?;
GEOREC(0.0, MAXLAT, MINALT, RE, F, MINV.as_slice_mut(), ctx)?;
MAXV[3] = 0.0;
MINV[3] = 0.0;
OUTRAD = VNORM(MAXV.as_slice());
INRAD = VNORM(MINV.as_slice());
} else if (MAXLAT <= 0.0) {
GEOREC(0.0, MAXLAT, MAXALT, RE, F, MAXV.as_slice_mut(), ctx)?;
GEOREC(0.0, MINLAT, MINALT, RE, F, MINV.as_slice_mut(), ctx)?;
MAXV[3] = 0.0;
MINV[3] = 0.0;
OUTRAD = VNORM(MAXV.as_slice());
INRAD = VNORM(MINV.as_slice());
} else {
OUTRAD = (RE + MAXALT);
MAXABS = intrinsics::DMAX1(&[f64::abs(MAXLAT), f64::abs(MINLAT)]);
GEOREC(0.0, MAXABS, MINALT, RE, F, MINV.as_slice_mut(), ctx)?;
MINV[3] = 0.0;
INRAD = VNORM(MINV.as_slice());
}
HDLON = ((MAXLON - MINLON) / 2 as f64);
MIDLON = (MINLON + HDLON);
if (HDLON <= HALFPI(ctx)) {
*LR = (OUTRAD - (INRAD * f64::cos(HDLON)));
} else {
*LR = ((1.0 - f64::cos(HDLON)) * OUTRAD);
}
if (HDLON > HALFPI(ctx)) {
*LT = (2.0 * OUTRAD);
} else {
*LT = ((2.0 * OUTRAD) * f64::sin(HDLON));
}
if (MINLAT >= 0.0) {
GEOREC(0.0, MAXLAT, MAXALT, RE, F, TOPV.as_slice_mut(), ctx)?;
GEOREC(0.0, MINLAT, MINALT, RE, F, BOTV.as_slice_mut(), ctx)?;
} else if (MAXLAT < 0.0) {
GEOREC(0.0, MAXLAT, MINALT, RE, F, TOPV.as_slice_mut(), ctx)?;
GEOREC(0.0, MINLAT, MAXALT, RE, F, BOTV.as_slice_mut(), ctx)?;
} else {
GEOREC(0.0, MAXLAT, MAXALT, RE, F, TOPV.as_slice_mut(), ctx)?;
GEOREC(0.0, MINLAT, MAXALT, RE, F, BOTV.as_slice_mut(), ctx)?;
}
MAXZ = TOPV[3];
MINZ = BOTV[3];
*LZ = (MAXZ - MINZ);
*LR = intrinsics::DMAX1(&[0.0, *LR]);
*LT = intrinsics::DMAX1(&[0.0, *LT]);
*LZ = intrinsics::DMAX1(&[0.0, *LZ]);
MIDR = (OUTRAD - (*LR / 2 as f64));
CYLREC(
MIDR,
MIDLON,
(MINZ + (*LZ / 2 as f64)),
CENTER.as_slice_mut(),
);
VPACK(
(*LR / 2 as f64),
(*LT / 2 as f64),
(*LZ / 2 as f64),
DIAG.as_slice_mut(),
);
*RADIUS = VNORM(DIAG.as_slice());
Ok(())
}