use geo::algorithm::euclidean_distance::EuclideanDistance;
use geo::Point;
use std::f64::consts::PI;
pub fn emission_probability(
gps: &Point<f64>,
candidate: &Point<f64>,
sigma: f64,
) -> f64 {
let distance = gps.euclidean_distance(candidate);
emission_probability_from_distance(distance, sigma)
}
pub fn emission_probability_from_distance(distance: f64, sigma: f64) -> f64 {
if distance > 200.0 {
return 0.0;
}
if sigma == 0.0 {
if distance == 0.0 {
return 1.0 / (2.0 * PI).sqrt(); } else {
return 0.0; }
}
let coefficient = 1.0 / (2.0 * PI).sqrt();
let exponent = -(distance * distance) / (2.0 * sigma * sigma);
coefficient * exponent.exp()
}