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 {
let rotate_rad = rotate.to_radians();
let cos_theta = rotate_rad.cos();
let sin_theta = rotate_rad.sin();
let a = major.powi(2) * sin_theta.powi(2) + minor.powi(2) * cos_theta.powi(2);
let b = major.powi(2) * sin_theta * cos_theta - minor.powi(2) * sin_theta * cos_theta;
let c = major.powi(2) * cos_theta.powi(2) + minor.powi(2) * sin_theta.powi(2);
let d = -2.0 * a * center.x - b * center.y;
let e = -b * center.x - 2.0 * c * center.y;
let f = a * center.x.powi(2) + b * center.x * center.y + c * center.y.powi(2) - major.powi(2) * minor.powi(2);
Self { a, b, c, d, e, f }
}
pub fn from_5_points(p1: Point, p2: Point, p3: Point, p4: Point, p5: Point) {
todo!()
}
}
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!()
}
}