In `flower.rs`, several arc commands are drawn with negative angles (or
negative extents), for example:
- Right leaves: [`circle_right(RIGHT_LEAF_TOP_RADIUS,
-RIGHT_LEAF_TOP_EXTENT,
75)`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/examples/flower.rs#L94)
- Petals: [`circle_right(PETALS_SPACE_RADIUS, -PETALS_SPACE_EXTENT,
30)`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/examples/flower.rs#L116)
- Petal finish: [`circle_left(PETALS_SIDE_RADIUS + 1.0, 3.0 -
PETALS_SIDE_EXTENT,
87)`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/examples/flower.rs#L124)
In SVG path arc syntax (`A rx ry x-axis-rotation large-arc-flag
sweep-flag x y`):
- `sweep-flag`: `1` specifies clockwise motion along the circle; `0`
specifies counter-clockwise motion.
- `large-arc-flag`: `1` specifies an arc sweep $> 180^\circ$; `0`
specifies $\le 180^\circ$.
In
[`turtle-lib/src/export_svg.rs`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/src/export_svg.rs):
1. **Sweep direction**: `sweep` was mapped purely based on
[`CircleDirection`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/src/circle_geometry.rs#L43)
(`Right => 1`, `Left => 0`), without taking the sign of `angle` into
account. Traveling a negative angle reverses the angular motion along
the circle (e.g. `Right` with a negative angle moves
counter-clockwise, needing `sweep = 0`). Because `sweep` was not
flipped for negative angles, SVG drew the arc on the opposite side of
the circle/chord, resulting in arcs bulging in the wrong direction
across the leaves and flower petals.
2. **Large arc flag**: `large_arc` was computed using `angle.value() >
180.0` rather than checking absolute magnitude `angle.value().abs() >
180.0`.
3. **Full circle check**: Full circle check compared `angle.value() -
360.0` instead of `angle.value().abs() - 360.0`.
In
[`turtle-lib/src/export_svg.rs`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/src/export_svg.rs#L116-L135):
- Determined `sweep` from both `direction` and `angle.value() >= 0.0`:
```rust
let sweep = match (direction, angle.value() >= 0.0) {
(CircleDirection::Right, true) | (CircleDirection::Left, false) => 1,
(CircleDirection::Left, true) | (CircleDirection::Right, false) => 0,
};
```
- Evaluated `large_arc` and full-circle checks using
`angle.value().abs()`.
- Added a unit test
[`test_svg_export_arc_negative_angle_sweep`](file:///home/dietrich/Projekte/Source/turtlers/turtle-lib/src/export_svg.rs#L302-L340)
to verify SVG arc sweep flags for negative angles.
turtle-lib
The main turtle graphics library built on Macroquad with Lyon tessellation.
See the main README for complete documentation.