feat: adding somme new transformation
* Rotate to rotate the image, !! Some point could be outside of the 0-4096 range on x and y !! you should parameter a center and an angle. All the point will move around the center. The angle is un degre. * Flip vertical: flip all the point verticaly. You should parameter an height where all point will flip * Flip horizontaly. You should parameter an X corrodinate where all point will flip around.
This commit is contained in:
parent
5f03d74080
commit
08e78b9a88
@ -1,12 +1,18 @@
|
|||||||
//pub mod common;
|
//pub mod common;
|
||||||
mod translate;
|
mod translate;
|
||||||
mod replicate;
|
mod replicate;
|
||||||
|
mod rotate;
|
||||||
|
mod flip_horizontal;
|
||||||
|
mod flip_vertical;
|
||||||
|
|
||||||
use crate::point::Point;
|
use crate::point::Point;
|
||||||
|
|
||||||
// re-export transformers to be abe to use it directly from transformer::
|
// re-export transformers to be abe to use it directly from transformer::
|
||||||
pub use translate::Translate;
|
pub use translate::Translate;
|
||||||
pub use replicate::Replicate;
|
pub use replicate::Replicate;
|
||||||
|
pub use rotate::Rotate;
|
||||||
|
pub use flip_horizontal::FlipHorizontal;
|
||||||
|
pub use flip_vertical::FlipVertical;
|
||||||
|
|
||||||
pub trait Transformers {
|
pub trait Transformers {
|
||||||
fn apply(&self, point_list: &[Point]) -> Vec<Point>;
|
fn apply(&self, point_list: &[Point]) -> Vec<Point>;
|
||||||
|
28
src/transformer/flip_horizontal.rs
Normal file
28
src/transformer/flip_horizontal.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use crate::transformer::Transformers;
|
||||||
|
use crate::point::Point;
|
||||||
|
use serde::{Serialize,Deserialize};
|
||||||
|
|
||||||
|
/// Flip Horizontal
|
||||||
|
|
||||||
|
#[derive(Serialize,Deserialize,Debug,Clone,Copy)]
|
||||||
|
pub struct FlipHorizontal {
|
||||||
|
x: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FlipHorizontal {
|
||||||
|
pub fn new(x: f32) -> Self {
|
||||||
|
Self {x}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Transformers for FlipHorizontal {
|
||||||
|
fn apply(&self, point_list: &[Point]) -> Vec<Point> {
|
||||||
|
point_list.iter()
|
||||||
|
.map(| pt | {
|
||||||
|
let dx = pt.x - self.x;
|
||||||
|
Point { x: dx - 2. * dx,
|
||||||
|
..*pt
|
||||||
|
}
|
||||||
|
}).collect()
|
||||||
|
}
|
||||||
|
}
|
28
src/transformer/flip_vertical.rs
Normal file
28
src/transformer/flip_vertical.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use crate::transformer::Transformers;
|
||||||
|
use crate::point::Point;
|
||||||
|
use serde::{Serialize,Deserialize};
|
||||||
|
|
||||||
|
/// Flip Vertical
|
||||||
|
|
||||||
|
#[derive(Serialize,Deserialize,Debug,Clone,Copy)]
|
||||||
|
pub struct FlipVertical {
|
||||||
|
y: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FlipVertical {
|
||||||
|
pub fn new(y: f32) -> Self {
|
||||||
|
Self {y}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Transformers for FlipVertical {
|
||||||
|
fn apply(&self, point_list: &[Point]) -> Vec<Point> {
|
||||||
|
point_list.iter()
|
||||||
|
.map(| pt | {
|
||||||
|
let dy = pt.y - self.y;
|
||||||
|
Point { y: dy - 2. * dy,
|
||||||
|
..*pt
|
||||||
|
}
|
||||||
|
}).collect()
|
||||||
|
}
|
||||||
|
}
|
39
src/transformer/rotate.rs
Normal file
39
src/transformer/rotate.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
use crate::transformer::Transformers;
|
||||||
|
use crate::point::Point;
|
||||||
|
use serde::{Serialize,Deserialize};
|
||||||
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
|
/// Rotate
|
||||||
|
|
||||||
|
#[derive(Serialize,Deserialize,Debug,Clone,Copy)]
|
||||||
|
pub struct Rotate {
|
||||||
|
cx: f32,
|
||||||
|
cy: f32,
|
||||||
|
angle: f32,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Rotate {
|
||||||
|
pub fn new(cx: f32, cy: f32, angle: f32) -> Self {
|
||||||
|
Self { cx, cy, angle: angle / 180. * PI}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Transformers for Rotate {
|
||||||
|
fn apply(&self, point_list: &[Point]) -> Vec<Point> {
|
||||||
|
point_list.iter()
|
||||||
|
.map(| pt | {
|
||||||
|
let dx = (pt.x - self.cx);
|
||||||
|
let dy = (pt.y - self.cy);
|
||||||
|
let cos = self.angle.cos();
|
||||||
|
let sin = self.angle.sin();
|
||||||
|
let x = (dx * cos - dy * sin) + self.cx;
|
||||||
|
let y = (dx * sin + dy * cos) + self.cy;
|
||||||
|
Point { x,
|
||||||
|
y,
|
||||||
|
..*pt
|
||||||
|
}
|
||||||
|
}).collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user