Implement image support for canvas widget
This commit is contained in:
parent
87a613edd1
commit
0ceee1cf3a
16 changed files with 485 additions and 29 deletions
|
|
@ -47,6 +47,62 @@ impl Rectangle<f32> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Creates a new square [`Rectangle`] with the center at the origin and
|
||||
/// with the given radius.
|
||||
pub fn with_radius(radius: f32) -> Self {
|
||||
Self {
|
||||
x: -radius,
|
||||
y: -radius,
|
||||
width: radius * 2.0,
|
||||
height: radius * 2.0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new axis-aligned [`Rectangle`] from the given vertices; returning the
|
||||
/// rotation in [`Radians`] that must be applied to the axis-aligned [`Rectangle`]
|
||||
/// to obtain the desired result.
|
||||
pub fn with_vertices(
|
||||
top_left: Point,
|
||||
top_right: Point,
|
||||
bottom_left: Point,
|
||||
) -> (Rectangle, Radians) {
|
||||
let width = (top_right.x - top_left.x).hypot(top_right.y - top_left.y);
|
||||
|
||||
let height =
|
||||
(bottom_left.x - top_left.x).hypot(bottom_left.y - top_left.y);
|
||||
|
||||
let rotation =
|
||||
(top_right.y - top_left.y).atan2(top_right.x - top_left.x);
|
||||
|
||||
let rotation = if rotation < 0.0 {
|
||||
2.0 * std::f32::consts::PI + rotation
|
||||
} else {
|
||||
rotation
|
||||
};
|
||||
|
||||
let position = {
|
||||
let center = Point::new(
|
||||
(top_right.x + bottom_left.x) / 2.0,
|
||||
(top_right.y + bottom_left.y) / 2.0,
|
||||
);
|
||||
|
||||
let rotation = -rotation - std::f32::consts::PI * 2.0;
|
||||
|
||||
Point::new(
|
||||
center.x + (top_left.x - center.x) * rotation.cos()
|
||||
- (top_left.y - center.y) * rotation.sin(),
|
||||
center.y
|
||||
+ (top_left.x - center.x) * rotation.sin()
|
||||
+ (top_left.y - center.y) * rotation.cos(),
|
||||
)
|
||||
};
|
||||
|
||||
(
|
||||
Rectangle::new(position, Size::new(width, height)),
|
||||
Radians(rotation),
|
||||
)
|
||||
}
|
||||
|
||||
/// Returns the [`Point`] at the center of the [`Rectangle`].
|
||||
pub fn center(&self) -> Point {
|
||||
Point::new(self.center_x(), self.center_y())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue