rewrite elliptical arc draw, fixes #10

master
Sameer Puri 4 years ago
parent 9621f7e71b
commit c1e19741fc

@ -385,36 +385,33 @@ impl<'input> Turtle<'input> {
let z = z.into(); let z = z.into();
let f = f.into(); let f = f.into();
let from = self.current_position; let inverse_transform = self.current_transform.inverse().unwrap();
let original_current_position = inverse_transform.transform_point(self.current_position);
let mut to: F64Point = point(x, y); let mut to: F64Point = point(x, y);
to = self.current_transform.transform_point(to);
if !abs { if !abs {
to -= vector(self.current_transform.m31, self.current_transform.m32); to += original_current_position.to_vector();
to += self.current_position.to_vector();
} }
let radii = vector(rx, ry);
let mut radii = vector(rx, ry); let svg_arc = SvgArc {
radii = self.current_transform.transform_vector(radii); from: original_current_position,
let arc = SvgArc {
from,
to, to,
radii, radii,
x_rotation: Angle { x_rotation: Angle::degrees(x_axis_rotation),
radians: x_axis_rotation, flags: ArcFlags { large_arc, sweep },
},
flags: ArcFlags {
large_arc: !large_arc,
sweep,
},
}; };
let arc = svg_arc.to_arc();
let last_point = std::cell::Cell::new(self.current_position); let last_point = std::cell::Cell::new(self.current_position);
let mut ellipse = vec![]; let mut ellipse = vec![];
arc.for_each_flattened(tolerance, &mut |point: F64Point| { arc.for_each_cubic_bezier(&mut |cbs| {
cbs.flattened(tolerance).for_each(|point| {
let point = self.current_transform.transform_point(point);
ellipse.append(&mut Self::linear_interpolation(point.x, point.y, z, f)); ellipse.append(&mut Self::linear_interpolation(point.x, point.y, z, f));
last_point.set(point); last_point.set(point);
}); });
});
self.current_position = last_point.get(); self.current_position = last_point.get();
self.previous_control = None; self.previous_control = None;

Loading…
Cancel
Save