use crate::Polygon;
use std::f64::consts::PI;
#[derive(Debug)]
pub struct Reg {
length: f64,
sides: f64,
}
impl Reg {
pub fn new(l: f64, s: f64) -> Option<Reg> {
if l == 0.0 || s == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: s,
})
}
}
pub fn tri(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 3.0,
})
}
}
pub fn quad(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 4.0,
})
}
}
pub fn pent(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 5.0,
})
}
}
pub fn hex(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 6.0,
})
}
}
pub fn sept(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 7.0,
})
}
}
pub fn oct(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 8.0,
})
}
}
pub fn non(l: f64) -> Option<Reg> {
if l == 0.0 {
None
} else {
Some(Reg {
length: l,
sides: 9.0,
})
}
}
}
impl Polygon for Reg {
fn area(&self) -> Option<f64> {
let p = &self.peri();
match p {
Some(perimeter) => {
let angle = PI / self.sides;
let apoth = self.length / (2.0 * angle.tan());
Some(perimeter * apoth * 0.5)
}
None => None,
}
}
fn peri(&self) -> Option<f64> {
Some(self.length * self.sides)
}
fn angles(&self) -> Option<Vec<f64>> {
let total = 180.0 * (&self.sides - 2.0);
Some(vec![total / self.sides; self.sides as usize])
}
}