sciforge_lib/physics/optics/
diffraction.rs1pub fn single_slit_intensity(theta: f64, a: f64, wavelength: f64) -> f64 {
2 let beta = std::f64::consts::PI * a * theta.sin() / wavelength;
3 if beta.abs() < 1e-15 {
4 return 1.0;
5 }
6 (beta.sin() / beta).powi(2)
7}
8
9pub fn double_slit_intensity(theta: f64, d: f64, wavelength: f64) -> f64 {
10 let delta = std::f64::consts::PI * d * theta.sin() / wavelength;
11 delta.cos().powi(2)
12}
13
14pub fn diffraction_grating_maxima(d: f64, wavelength: f64, order: i32) -> f64 {
15 let sin_theta = order as f64 * wavelength / d;
16 if sin_theta.abs() > 1.0 {
17 return f64::NAN;
18 }
19 sin_theta.asin()
20}
21
22pub fn resolving_power_grating(order: i32, n_slits: u32) -> f64 {
23 order.abs() as f64 * n_slits as f64
24}
25
26pub fn rayleigh_criterion(wavelength: f64, aperture: f64) -> f64 {
27 1.22 * wavelength / aperture
28}
29
30pub fn airy_disk_radius(wavelength: f64, f_number: f64) -> f64 {
31 1.22 * wavelength * f_number
32}
33
34pub fn fraunhofer_distance(aperture: f64, wavelength: f64) -> f64 {
35 2.0 * aperture * aperture / wavelength
36}
37
38pub fn grating_dispersion(order: i32, d: f64, theta: f64) -> f64 {
39 order as f64 / (d * theta.cos())
40}
41
42pub fn bragg_condition(d_spacing: f64, theta: f64, wavelength: f64) -> f64 {
43 2.0 * d_spacing * theta.sin() / wavelength
44}
45
46pub fn circular_aperture_first_zero(wavelength: f64, diameter: f64) -> f64 {
47 1.22 * wavelength / diameter
48}