use crate::{π, Ellipse, Float, Point};
use std::ops::Div;
impl Ellipse {
pub fn from_coefficient(a: Float, b: Float, c: Float, d: Float, e: Float, f: Float) -> Self {
Self { a, b: b.div(2.0), c, d: d.div(2.0), e: e.div(2.0), f }
}
pub fn from_transform(center: &Point, major: Float, minor: Float, rotate: Float) -> Self {
todo!()
}
pub fn from_5_points(p1: &Point, p2: &Point, p3: &Point, p4: &Point, p5: &Point) {}
}
impl Ellipse {
pub fn major_axis(&self) -> Float {
self.a
}
pub fn minor_axis(&self) -> Float {
self.b
}
pub fn major_delta(&self) -> Float {
let Self { a, b, c, d, e, f } = self;
a * c * f + 2.0 * b * d * e - a * e * e - c * d * d - f * b * b
}
pub fn minor_delta(&self) -> Float {
let Self { a, b, c, d: _, e: _, f: _ } = self;
a * c - b * b
}
pub fn rotate(&self) -> Float {
let Self { a, b, c, d: _, e: _, f: _ } = self;
match a.eq(b) {
true => π / 4.0,
false => (b.div(a - c)).atan() / 2.0,
}
}
pub fn center(&self) -> Point {
let Self { a, b, c, d, e, f: _ } = self;
let x = (b * e - c * d) / self.minor_delta();
let y = (b * d - a * e) / self.minor_delta();
Point { x, y }
}
pub fn parameter(&self) -> (Float, Float, Float, Float, Float, Float) {
(self.a, self.b, self.c, self.d, self.e, self.f)
}
pub fn parameter_matrix(&self) -> [[Float; 3]; 3] {
[[self.a, self.b, self.d], [self.d, self.c, self.e], [self.d, self.e, self.f]]
}
pub fn transform(&self) -> (Point, Float, Float, Float) {
todo!()
}
pub fn transform_matrix(&self) -> [[Float; 3]; 3] {
todo!()
}
}