#[derive(Copy, Clone, PartialEq, Debug)]
pub struct Motion {
pub speed: f64,
pub steer: f64,
}
impl Motion {
pub fn new(speed: f64, steer: f64) -> Motion {
Motion {speed, steer}
}
pub fn default() -> Motion {
Motion {speed: 0.0, steer: 0.0}
}
}
#[derive(Copy, Clone, PartialEq, Debug)]
pub struct Size {
pub curb_to_curb: f64,
pub width: f64, pub wheelbase: f64, pub distance_to_front: f64, pub length: f64,
}
impl Size {
pub fn new(
curb_to_curb: f64,
width: f64,
wheelbase: f64,
distance_to_front: f64,
length: f64,
) -> Size {
Size {
curb_to_curb,
width,
wheelbase,
distance_to_front,
length,
}
}
pub fn default_porsche() -> Size {
Size {
curb_to_curb: 11.8872,
width: 2.165,
wheelbase: 2.950,
distance_to_front: 3.9865,
length: 5.049,
}
}
pub fn default_fiat() -> Size {
Size {
curb_to_curb: 10.820,
width: 1.625,
wheelbase: 2.450,
distance_to_front: 3.105,
length: 3.760,
}
}
pub fn default() -> Size {
Size::default_fiat()
}
pub fn diagonal_length(&self) -> f64 {
(self.width.powi(2) + self.length.powi(2)).sqrt()
}
pub fn max_steer(&self) -> f64 {
self.wheelbase.atan2((
(self.curb_to_curb/2.0).powi(2)
- self.wheelbase.powi(2)
).sqrt() - self.width/2.0)
}
pub fn perfect_parking_slot_length(&self) -> f64 {
let r = self.curb_to_curb / 2.0;
let l = self.wheelbase;
let k = self.distance_to_front - self.wheelbase;
let w = self.width;
self.length
+ (
(r * r - l * l)
+ (l + k).powi(2)
- ((r * r - l * l).sqrt() - w).powi(2)
).sqrt()
- l
- k
}
}