pub struct Constraint {
pub membership: Membership,
pub query: Query,
pub pixel_scale: Option<(f64, f64)>,
}Expand description
A Membership shape combined with a Query mode (and the plate scale,
when known, so pixel offsets can be reported).
Build one with a shape constructor (within,
circular, frame,
frame_rotated), then optionally switch the
query mode (all, nearest_one,
nearest_n,
nearest_n_within). Pass the result to
rank, Matcher::query, or is_framed.
§Example
use skymath::{Angle, Equatorial, ParseMode};
use target_match::{rank, Constraint, Field, Optics, RadiusPolicy, SkyObject};
struct Target {
ra: f64,
dec: f64,
}
impl SkyObject for Target {
fn position(&self) -> Equatorial {
Equatorial::j2000(Angle::from_degrees(self.ra), Angle::from_degrees(self.dec)).unwrap()
}
}
let catalog = [Target { ra: 10.6847, dec: 41.2688 }];
let pointing = Equatorial::parse_j2000("00:42:44.3", "+41:16:09", ParseMode::Strict).unwrap();
let field = Field::from_optics(Optics {
focal_mm: 800.0,
pixel_um: (3.76, 3.76),
binning: (1, 1),
pixels: (6248, 4176),
})
.unwrap();
let c = Constraint::within(&field, RadiusPolicy::Circumscribed).nearest_one();
assert_eq!(rank(pointing, &catalog, c).len(), 1);Fields§
§membership: MembershipThe in-frame shape.
query: QueryThe query mode.
pixel_scale: Option<(f64, f64)>Per-axis plate scale (arcsec/px), used only to fill pixel offsets.
Implementations§
Source§impl Constraint
impl Constraint
Sourcepub fn within(field: &Field, policy: RadiusPolicy) -> Self
pub fn within(field: &Field, policy: RadiusPolicy) -> Self
Circular membership with a radius derived from a field under policy.
§Example
use target_match::{Constraint, Field, Optics, RadiusPolicy};
let field = Field::from_optics(Optics {
focal_mm: 800.0,
pixel_um: (3.76, 3.76),
binning: (1, 1),
pixels: (6248, 4176),
})
.unwrap();
let c = Constraint::within(&field, RadiusPolicy::Circumscribed);
assert!(c.pixel_scale.is_some(), "the field's plate scale carries through");Sourcepub fn circular(radius: Angle) -> Self
pub fn circular(radius: Angle) -> Self
Circular membership with an explicit radius (no plate scale).
§Example
use skymath::Angle;
use target_match::Constraint;
let c = Constraint::circular(Angle::from_degrees(2.0));
assert!(c.pixel_scale.is_none(), "no `Field`, so no plate scale");Sourcepub fn frame(field: &Field) -> Self
pub fn frame(field: &Field) -> Self
Axis-aligned rectangular membership from a field’s width×height.
§Example
use target_match::{Constraint, Field, Membership, Optics};
let field = Field::from_optics(Optics {
focal_mm: 800.0,
pixel_um: (3.76, 3.76),
binning: (1, 1),
pixels: (6248, 4176),
})
.unwrap();
let c = Constraint::frame(&field);
assert!(matches!(c.membership, Membership::Rectangle { .. }));Sourcepub fn frame_rotated(field: &Field, position_angle: Angle) -> Self
pub fn frame_rotated(field: &Field, position_angle: Angle) -> Self
Rotated rectangular membership from a field and a camera position angle (degrees East of North).
§Example
An object due north of the pointing sits on the frame’s +y axis when
axis-aligned; a 90° East-of-North camera rotation moves it onto the -x
axis.
use skymath::{Angle, Equatorial, ParseMode};
use target_match::{rank, Constraint, Field, SkyObject};
struct Target {
ra: f64,
dec: f64,
}
impl SkyObject for Target {
fn position(&self) -> Equatorial {
Equatorial::j2000(Angle::from_degrees(self.ra), Angle::from_degrees(self.dec)).unwrap()
}
}
let pointing = Equatorial::parse_j2000("00:42:44.3", "+41:16:09", ParseMode::Strict).unwrap();
let field = Field::from_fov(Angle::from_degrees(2.0), Angle::from_degrees(2.0)).unwrap();
let catalog = [Target { ra: 10.6847, dec: 41.2688 + 0.3 }]; // ~0.3° due north
let (ax, ay) = rank(pointing, &catalog, Constraint::frame(&field))[0].offset.frame.unwrap();
assert!(ay.degrees() > 0.25 && ax.degrees().abs() < 0.05);
let rotated = Constraint::frame_rotated(&field, Angle::from_degrees(90.0));
let (rx, ry) = rank(pointing, &catalog, rotated)[0].offset.frame.unwrap();
assert!(rx.degrees() < -0.25 && ry.degrees().abs() < 0.05);Sourcepub fn all(self) -> Self
pub fn all(self) -> Self
Set the query to all-within-field.
§Example
use skymath::Angle;
use target_match::{Constraint, Query};
let c = Constraint::circular(Angle::from_degrees(1.0)).nearest_one().all();
assert_eq!(c.query, Query::AllWithinField);Sourcepub fn nearest_one(self) -> Self
pub fn nearest_one(self) -> Self
Set the query to nearest-one.
§Example
use skymath::Angle;
use target_match::{Constraint, Query};
let c = Constraint::circular(Angle::from_degrees(1.0)).nearest_one();
assert_eq!(c.query, Query::NearestOne);Sourcepub fn nearest_n(self, n: usize) -> Self
pub fn nearest_n(self, n: usize) -> Self
Set the query to the n nearest (unbounded).
§Example
use skymath::Angle;
use target_match::{Constraint, Query};
let c = Constraint::circular(Angle::from_degrees(1.0)).nearest_n(3);
assert_eq!(c.query, Query::NearestN { n: 3, max_radius: None });Sourcepub fn nearest_n_within(self, n: usize, max_radius: Angle) -> Self
pub fn nearest_n_within(self, n: usize, max_radius: Angle) -> Self
Set the query to the n nearest within max_radius.
§Example
use skymath::Angle;
use target_match::{Constraint, Query};
let radius = Angle::from_degrees(1.0);
let c = Constraint::circular(radius).nearest_n_within(3, radius);
assert_eq!(c.query, Query::NearestN { n: 3, max_radius: Some(radius) });Trait Implementations§
Source§impl Clone for Constraint
impl Clone for Constraint
Source§fn clone(&self) -> Constraint
fn clone(&self) -> Constraint
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more