Use Radians in arc and ellipse types
This commit is contained in:
parent
8ed3490280
commit
c077e107f2
5 changed files with 74 additions and 26 deletions
|
|
@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Update `wgpu` to `0.17`. [#2065](https://github.com/iced-rs/iced/pull/2065)
|
- Update `wgpu` to `0.17`. [#2065](https://github.com/iced-rs/iced/pull/2065)
|
||||||
- Support automatic style type casting for `Button`. [#2046](https://github.com/iced-rs/iced/pull/2046)
|
- Support automatic style type casting for `Button`. [#2046](https://github.com/iced-rs/iced/pull/2046)
|
||||||
- `with_clip` and `with_save` in `Frame` can now return the data of the provided closure. [#1994](https://github.com/iced-rs/iced/pull/1994)
|
- `with_clip` and `with_save` in `Frame` can now return the data of the provided closure. [#1994](https://github.com/iced-rs/iced/pull/1994)
|
||||||
|
- `Arc` and `arc::Elliptical` now use `Radians` for angle fields. [#2027](https://github.com/iced-rs/iced/pull/2027)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Clipping of `TextInput` selection. [#2199](https://github.com/iced-rs/iced/pull/2199)
|
- Clipping of `TextInput` selection. [#2199](https://github.com/iced-rs/iced/pull/2199)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::{Point, Rectangle, Vector};
|
use crate::{Point, Rectangle, Vector};
|
||||||
|
|
||||||
use std::f32::consts::{FRAC_PI_2, PI};
|
use std::f32::consts::{FRAC_PI_2, PI};
|
||||||
use std::ops::RangeInclusive;
|
use std::ops::{Add, AddAssign, Div, Mul, RangeInclusive, Sub, SubAssign};
|
||||||
|
|
||||||
/// Degrees
|
/// Degrees
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
|
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
|
||||||
|
|
@ -71,3 +71,47 @@ impl Radians {
|
||||||
(start, end)
|
(start, end)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SubAssign<Radians> for Radians {
|
||||||
|
fn sub_assign(&mut self, rhs: Radians) {
|
||||||
|
self.0 = self.0 - rhs.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddAssign<Radians> for Radians {
|
||||||
|
fn add_assign(&mut self, rhs: Radians) {
|
||||||
|
self.0 = self.0 + rhs.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add<Radians> for Radians {
|
||||||
|
type Output = Radians;
|
||||||
|
|
||||||
|
fn add(self, rhs: Radians) -> Self::Output {
|
||||||
|
Radians(self.0 + rhs.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub<Radians> for Radians {
|
||||||
|
type Output = Radians;
|
||||||
|
|
||||||
|
fn sub(self, rhs: Radians) -> Self::Output {
|
||||||
|
Radians(self.0 - rhs.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mul<f32> for Radians {
|
||||||
|
type Output = Radians;
|
||||||
|
|
||||||
|
fn mul(self, rhs: f32) -> Self::Output {
|
||||||
|
Radians(self.0 * rhs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Div<f32> for Radians {
|
||||||
|
type Output = Radians;
|
||||||
|
|
||||||
|
fn div(self, rhs: f32) -> Self::Output {
|
||||||
|
Radians(self.0 / rhs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ use iced::mouse;
|
||||||
use iced::time::Instant;
|
use iced::time::Instant;
|
||||||
use iced::widget::canvas;
|
use iced::widget::canvas;
|
||||||
use iced::window::{self, RedrawRequest};
|
use iced::window::{self, RedrawRequest};
|
||||||
|
use iced::Radians;
|
||||||
use iced::{
|
use iced::{
|
||||||
Background, Color, Element, Event, Length, Rectangle, Renderer, Size,
|
Background, Color, Element, Event, Length, Rectangle, Renderer, Size,
|
||||||
Vector,
|
Vector,
|
||||||
|
|
@ -18,8 +19,8 @@ use super::easing::{self, Easing};
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
const MIN_RADIANS: f32 = PI / 8.0;
|
const MIN_ANGLE: Radians = Radians(PI / 8.0);
|
||||||
const WRAP_RADIANS: f32 = 2.0 * PI - PI / 4.0;
|
const WRAP_ANGLE: Radians = Radians(2.0 * PI - PI / 4.0);
|
||||||
const BASE_ROTATION_SPEED: u32 = u32::MAX / 80;
|
const BASE_ROTATION_SPEED: u32 = u32::MAX / 80;
|
||||||
|
|
||||||
#[allow(missing_debug_implementations)]
|
#[allow(missing_debug_implementations)]
|
||||||
|
|
@ -139,7 +140,7 @@ impl Animation {
|
||||||
progress: 0.0,
|
progress: 0.0,
|
||||||
rotation: rotation.wrapping_add(
|
rotation: rotation.wrapping_add(
|
||||||
BASE_ROTATION_SPEED.wrapping_add(
|
BASE_ROTATION_SPEED.wrapping_add(
|
||||||
((WRAP_RADIANS / (2.0 * PI)) * u32::MAX as f32) as u32,
|
((WRAP_ANGLE.0 / (2.0 * PI)) * u32::MAX as f32) as u32,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
last: now,
|
last: now,
|
||||||
|
|
@ -318,7 +319,7 @@ where
|
||||||
|
|
||||||
let mut builder = canvas::path::Builder::new();
|
let mut builder = canvas::path::Builder::new();
|
||||||
|
|
||||||
let start = state.animation.rotation() * 2.0 * PI;
|
let start = iced::Radians(state.animation.rotation() * 2.0 * PI);
|
||||||
|
|
||||||
match state.animation {
|
match state.animation {
|
||||||
Animation::Expanding { progress, .. } => {
|
Animation::Expanding { progress, .. } => {
|
||||||
|
|
@ -327,8 +328,8 @@ where
|
||||||
radius: track_radius,
|
radius: track_radius,
|
||||||
start_angle: start,
|
start_angle: start,
|
||||||
end_angle: start
|
end_angle: start
|
||||||
+ MIN_RADIANS
|
+ MIN_ANGLE
|
||||||
+ WRAP_RADIANS * (self.easing.y_at_x(progress)),
|
+ WRAP_ANGLE * (self.easing.y_at_x(progress)),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Animation::Contracting { progress, .. } => {
|
Animation::Contracting { progress, .. } => {
|
||||||
|
|
@ -336,8 +337,8 @@ where
|
||||||
center: frame.center(),
|
center: frame.center(),
|
||||||
radius: track_radius,
|
radius: track_radius,
|
||||||
start_angle: start
|
start_angle: start
|
||||||
+ WRAP_RADIANS * (self.easing.y_at_x(progress)),
|
+ WRAP_ANGLE * (self.easing.y_at_x(progress)),
|
||||||
end_angle: start + MIN_RADIANS + WRAP_RADIANS,
|
end_angle: start + MIN_ANGLE + WRAP_ANGLE,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
//! Build and draw curves.
|
//! Build and draw curves.
|
||||||
use iced_core::{Point, Vector};
|
use iced_core::{Point, Radians, Vector};
|
||||||
|
|
||||||
/// A segment of a differentiable curve.
|
/// A segment of a differentiable curve.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
|
@ -8,10 +8,10 @@ pub struct Arc {
|
||||||
pub center: Point,
|
pub center: Point,
|
||||||
/// The radius of the arc.
|
/// The radius of the arc.
|
||||||
pub radius: f32,
|
pub radius: f32,
|
||||||
/// The start of the segment's angle in radians, clockwise rotation from positive x-axis.
|
/// The start of the segment's angle, clockwise rotation from positive x-axis.
|
||||||
pub start_angle: f32,
|
pub start_angle: Radians,
|
||||||
/// The end of the segment's angle in radians, clockwise rotation from positive x-axis.
|
/// The end of the segment's angle, clockwise rotation from positive x-axis.
|
||||||
pub end_angle: f32,
|
pub end_angle: Radians,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An elliptical [`Arc`].
|
/// An elliptical [`Arc`].
|
||||||
|
|
@ -22,11 +22,11 @@ pub struct Elliptical {
|
||||||
/// The radii of the arc's ellipse. The horizontal and vertical half-dimensions of the ellipse will match the x and y values of the radii vector.
|
/// The radii of the arc's ellipse. The horizontal and vertical half-dimensions of the ellipse will match the x and y values of the radii vector.
|
||||||
pub radii: Vector,
|
pub radii: Vector,
|
||||||
/// The clockwise rotation of the arc's ellipse.
|
/// The clockwise rotation of the arc's ellipse.
|
||||||
pub rotation: f32,
|
pub rotation: Radians,
|
||||||
/// The start of the segment's angle in radians, clockwise rotation from positive x-axis.
|
/// The start of the segment's angle, clockwise rotation from positive x-axis.
|
||||||
pub start_angle: f32,
|
pub start_angle: Radians,
|
||||||
/// The end of the segment's angle in radians, clockwise rotation from positive x-axis.
|
/// The end of the segment's angle, clockwise rotation from positive x-axis.
|
||||||
pub end_angle: f32,
|
pub end_angle: Radians,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Arc> for Elliptical {
|
impl From<Arc> for Elliptical {
|
||||||
|
|
@ -34,7 +34,7 @@ impl From<Arc> for Elliptical {
|
||||||
Elliptical {
|
Elliptical {
|
||||||
center: arc.center,
|
center: arc.center,
|
||||||
radii: Vector::new(arc.radius, arc.radius),
|
radii: Vector::new(arc.radius, arc.radius),
|
||||||
rotation: 0.0,
|
rotation: Radians(0.0),
|
||||||
start_angle: arc.start_angle,
|
start_angle: arc.start_angle,
|
||||||
end_angle: arc.end_angle,
|
end_angle: arc.end_angle,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::geometry::path::{arc, Arc, Path};
|
use crate::geometry::path::{arc, Arc, Path};
|
||||||
|
|
||||||
use iced_core::{Point, Size};
|
use iced_core::{Point, Radians, Size};
|
||||||
|
|
||||||
use lyon_path::builder::{self, SvgPathBuilder};
|
use lyon_path::builder::{self, SvgPathBuilder};
|
||||||
use lyon_path::geom;
|
use lyon_path::geom;
|
||||||
|
|
@ -106,9 +106,11 @@ impl Builder {
|
||||||
let arc = geom::Arc {
|
let arc = geom::Arc {
|
||||||
center: math::Point::new(arc.center.x, arc.center.y),
|
center: math::Point::new(arc.center.x, arc.center.y),
|
||||||
radii: math::Vector::new(arc.radii.x, arc.radii.y),
|
radii: math::Vector::new(arc.radii.x, arc.radii.y),
|
||||||
x_rotation: math::Angle::radians(arc.rotation),
|
x_rotation: math::Angle::radians(arc.rotation.0),
|
||||||
start_angle: math::Angle::radians(arc.start_angle),
|
start_angle: math::Angle::radians(arc.start_angle.0),
|
||||||
sweep_angle: math::Angle::radians(arc.end_angle - arc.start_angle),
|
sweep_angle: math::Angle::radians(
|
||||||
|
(arc.end_angle - arc.start_angle).0,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = self.raw.move_to(arc.sample(0.0));
|
let _ = self.raw.move_to(arc.sample(0.0));
|
||||||
|
|
@ -165,8 +167,8 @@ impl Builder {
|
||||||
self.arc(Arc {
|
self.arc(Arc {
|
||||||
center,
|
center,
|
||||||
radius,
|
radius,
|
||||||
start_angle: 0.0,
|
start_angle: Radians(0.0),
|
||||||
end_angle: 2.0 * std::f32::consts::PI,
|
end_angle: Radians(2.0 * std::f32::consts::PI),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue