9#include <janus/math/Arithmetic.hpp>
10#include <janus/math/Linalg.hpp>
11#include <janus/math/Logic.hpp>
12#include <janus/math/Trig.hpp>
28template <
typename Scalar>
30 const Vec3<Scalar> &r_target) {
31 Vec3<Scalar> delta = r_target - r_observer;
32 return janus::norm(delta);
50template <
typename Scalar>
52 const Vec3<Scalar> &r_target) {
53 Vec3<Scalar> delta = r_target - r_observer;
60 Scalar horiz_dist = janus::sqrt(dx * dx + dy * dy);
61 Scalar
range = janus::norm(delta);
64 Scalar eps = Scalar(1e-12);
65 Scalar is_zero =
range < eps;
68 Scalar azimuth = janus::atan2(dy, dx);
69 azimuth = janus::where(is_zero, Scalar(0), azimuth);
73 Scalar elevation = janus::atan2(-dz, horiz_dist);
74 elevation = janus::where(is_zero, Scalar(0), elevation);
77 angles << azimuth, elevation;
94template <
typename Scalar>
95Vec2<Scalar>
los_rate(
const Vec3<Scalar> &r_obs,
const Vec3<Scalar> &v_obs,
96 const Vec3<Scalar> &r_tgt,
const Vec3<Scalar> &v_tgt) {
98 Vec3<Scalar> r_rel = r_tgt - r_obs;
99 Vec3<Scalar> v_rel = v_tgt - v_obs;
101 Scalar dx = r_rel(0);
102 Scalar dy = r_rel(1);
103 Scalar dz = r_rel(2);
104 Scalar vx = v_rel(0);
105 Scalar vy = v_rel(1);
106 Scalar vz = v_rel(2);
109 Scalar range_sq = dx * dx + dy * dy + dz * dz;
110 Scalar
range = janus::sqrt(range_sq);
111 Scalar horiz_sq = dx * dx + dy * dy;
112 Scalar horiz = janus::sqrt(horiz_sq);
115 Scalar eps = Scalar(1e-12);
116 Scalar is_range_zero =
range < eps;
117 Scalar is_horiz_zero = horiz < eps;
120 Scalar az_rate = (dx * vy - dy * vx) / horiz_sq;
121 az_rate = janus::where(is_horiz_zero, Scalar(0), az_rate);
127 Scalar d_horiz_dt = (dx * vx + dy * vy) / horiz;
128 d_horiz_dt = janus::where(is_horiz_zero, Scalar(0), d_horiz_dt);
130 Scalar el_rate = (-horiz * vz + dz * d_horiz_dt) / range_sq;
131 el_rate = janus::where(is_range_zero, Scalar(0), el_rate);
134 rates << az_rate, el_rate;
155template <
typename Scalar>
157 const Vec3<Scalar> &direction,
158 const Vec3<Scalar> ¢er,
159 const Scalar &radius) {
161 Vec3<Scalar> oc = center - origin;
164 Scalar tca = janus::dot(oc, direction);
167 Scalar oc_sq = janus::dot(oc, oc);
168 Scalar d_sq = oc_sq - tca * tca;
171 Scalar r_sq = radius * radius;
172 Scalar misses = d_sq > r_sq;
175 Scalar thc = janus::sqrt(janus::abs(r_sq - d_sq));
179 Scalar t0 = tca - thc;
180 Scalar t1 = tca + thc;
183 Scalar t0_positive = t0 > Scalar(0);
184 Scalar t1_positive = t1 > Scalar(0);
185 Scalar t = janus::where(t0_positive, t0, t1);
188 Scalar no_intersection = misses + (!t0_positive * !t1_positive) > Scalar(0);
189 return janus::where(no_intersection, Scalar(-1), t);
204template <
typename Scalar>
206 const Vec3<Scalar> &direction,
207 const Vec3<Scalar> &plane_normal,
208 const Vec3<Scalar> &plane_point) {
210 Scalar denom = janus::dot(direction, plane_normal);
213 Scalar eps = Scalar(1e-12);
214 Scalar is_parallel = janus::abs(denom) < eps;
217 Vec3<Scalar> diff = plane_point - origin;
218 Scalar t = janus::dot(diff, plane_normal) / denom;
221 Scalar invalid = is_parallel + (t < Scalar(0)) > Scalar(0);
222 return janus::where(invalid, Scalar(-1), t);
239template <
typename Scalar>
241 const Vec3<Scalar> &axis,
const Scalar &half_angle) {
243 Vec3<Scalar> to_point = point - apex;
244 Scalar dist = janus::norm(to_point);
247 Scalar eps = Scalar(1e-12);
248 Scalar is_at_apex = dist < eps;
251 Vec3<Scalar> to_point_norm = to_point / dist;
254 Scalar cos_angle = janus::dot(axis, to_point_norm);
255 Scalar cos_half_angle = janus::cos(half_angle);
259 Scalar inside = cos_angle > cos_half_angle;
262 return janus::where(is_at_apex, Scalar(1), inside);
278template <
typename Scalar>
280 const Vec3<Scalar> &plane_normal,
281 const Vec3<Scalar> &plane_point) {
283 Vec3<Scalar> diff = point - plane_point;
284 Scalar dist = janus::dot(diff, plane_normal);
287 return point - dist * plane_normal;
301template <
typename Scalar>
320template <
typename Scalar>
Definition Geometry.hpp:14
LLA< Scalar > ground_track_point(const Vec3< Scalar > &r_ecef, const EarthModel &model=EarthModel::WGS84())
Project ECEF position to ellipsoid surface (ground track point).
Definition Geometry.hpp:302
Scalar point_in_cone(const Vec3< Scalar > &point, const Vec3< Scalar > &apex, const Vec3< Scalar > &axis, const Scalar &half_angle)
Check if a point lies within a cone (e.g., sensor FOV).
Definition Geometry.hpp:240
Vec2< Scalar > los_angles(const Vec3< Scalar > &r_observer, const Vec3< Scalar > &r_target)
Compute line-of-sight azimuth and elevation angles.
Definition Geometry.hpp:51
Vec3< Scalar > ground_track_ecef(const Vec3< Scalar > &r_ecef, const EarthModel &model=EarthModel::WGS84())
Compute ground track point and return as ECEF.
Definition Geometry.hpp:321
Scalar slant_range(const Vec3< Scalar > &r_observer, const Vec3< Scalar > &r_target)
Compute slant range (distance) between two points.
Definition Geometry.hpp:29
Scalar ray_sphere_intersection(const Vec3< Scalar > &origin, const Vec3< Scalar > &direction, const Vec3< Scalar > ¢er, const Scalar &radius)
Ray-sphere intersection.
Definition Geometry.hpp:156
Vec3< Scalar > project_to_plane(const Vec3< Scalar > &point, const Vec3< Scalar > &plane_normal, const Vec3< Scalar > &plane_point)
Project a point onto a plane.
Definition Geometry.hpp:279
Vec2< Scalar > los_rate(const Vec3< Scalar > &r_obs, const Vec3< Scalar > &v_obs, const Vec3< Scalar > &r_tgt, const Vec3< Scalar > &v_tgt)
Compute line-of-sight angular rates.
Definition Geometry.hpp:95
Scalar ray_plane_intersection(const Vec3< Scalar > &origin, const Vec3< Scalar > &direction, const Vec3< Scalar > &plane_normal, const Vec3< Scalar > &plane_point)
Ray-plane intersection.
Definition Geometry.hpp:205
Scalar range(const Vec3< Scalar > &r1, const Vec3< Scalar > &r2)
Definition FrameKinematics.hpp:178
Vec3< Scalar > lla_to_ecef(const LLA< Scalar > &lla, const EarthModel &m=EarthModel::WGS84())
Definition Geodetic.hpp:152
LLA< Scalar > ecef_to_lla(const Vec3< Scalar > &r, const EarthModel &m=EarthModel::WGS84())
Definition Geodetic.hpp:78
Definition EarthModel.hpp:27
static constexpr EarthModel WGS84()
WGS84 reference ellipsoid (most common for GPS/navigation).
Definition EarthModel.hpp:45
Definition Geodetic.hpp:27
Scalar lon
Longitude [rad], positive East, range [-π, π].
Definition Geodetic.hpp:28
Scalar lat
Geodetic latitude [rad], range [-π/2, π/2].
Definition Geodetic.hpp:29