mod arc;
mod cubics;
mod geometry;
use crate::output::path::CubicSegment;
use crate::process::Processor;
use crate::types::{Point, Vector};
use cubics::build_cubics;
use geometry::resolve_geometry;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SmoothCornerGeometry {
pub origin: Point,
pub incoming_axis: Vector,
pub outgoing_axis: Vector,
pub radius: f64,
pub smoothing: f64,
pub incoming_limit: f64,
pub outgoing_limit: f64,
pub angle: f64,
pub base_tangent: f64,
pub incoming_influence: f64,
pub outgoing_influence: f64,
pub alpha0: f64,
pub alpha1: f64,
pub middle_arc_angle: f64,
pub start: Point,
pub end: Point,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct SmoothCornerRequest {
pub(crate) origin: Point,
pub(crate) incoming_axis: Vector,
pub(crate) outgoing_axis: Vector,
pub(crate) radius: f64,
pub(crate) smoothing: f64,
pub(crate) incoming_limit: f64,
pub(crate) outgoing_limit: f64,
pub(crate) angle: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct ProcessedSmoothCorner {
pub(crate) geometry: SmoothCornerGeometry,
pub(crate) cubics: Vec<CubicSegment>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct SmoothCornerProcessor {
request: SmoothCornerRequest,
}
impl SmoothCornerProcessor {
pub(crate) fn new(request: SmoothCornerRequest) -> Self {
Self { request }
}
}
impl Processor for SmoothCornerProcessor {
type Output = ProcessedSmoothCorner;
fn process(&self) -> Self::Output {
let geometry = resolve_geometry(self.request);
let cubics = build_cubics(geometry);
ProcessedSmoothCorner { geometry, cubics }
}
}