87 lines
2.3 KiB
Rust
87 lines
2.3 KiB
Rust
use crate::point::{Color, Point};
|
|
use crate::transformer::Transformers;
|
|
use crate::worldstate::WorldState;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use std::f32::consts::PI;
|
|
|
|
/// Angle Optimisation
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
|
|
pub struct AngleOptimisation {
|
|
coef: f32,
|
|
}
|
|
|
|
fn color_not_zero(p1: &Point, p2: &Point, p3: &Point) -> bool {
|
|
let c0 = Color { r: 0, g: 0, b: 0 };
|
|
if p1.color == c0 || p2.color == c0 || p3.color == c0 {
|
|
false
|
|
} else {
|
|
true
|
|
}
|
|
}
|
|
|
|
fn pos_different(p1: &Point, p2: &Point) -> bool {
|
|
if p1.x == p2.x && p1.y == p2.y {
|
|
false
|
|
} else {
|
|
true
|
|
}
|
|
}
|
|
|
|
impl Transformers for AngleOptimisation {
|
|
fn apply(&self, point_list: &[Point], _ws: &WorldState) -> Vec<Point> {
|
|
let c0 = Color { r: 0, g: 0, b: 0 };
|
|
let mut v = vec![];
|
|
|
|
//println!();
|
|
//println!("====================");
|
|
//println!("= next Frame =");
|
|
//println!("====================");
|
|
v.push(point_list[0]);
|
|
for i in 1..(point_list.len() - 1) {
|
|
let prev = point_list[i - 1];
|
|
let node = point_list[i];
|
|
let next = point_list[i + 1];
|
|
|
|
if color_not_zero(&prev, &node, &next)
|
|
&& pos_different(&prev, &node)
|
|
&& pos_different(&node, &next)
|
|
{
|
|
//println!("=========");
|
|
let mut d1 = Point::diff(&node, &prev);
|
|
let mut d2 = Point::diff(&next, &next);
|
|
//dbg!(d1);
|
|
//dbg!(d2);
|
|
d1.normalize();
|
|
d2.normalize();
|
|
|
|
let cross = d1.cross(&d2);
|
|
let angle = d1.cross(&d2).acos();
|
|
|
|
let deg = angle * 180. / PI;
|
|
|
|
//dbg!(prev);
|
|
//dbg!(node);
|
|
//dbg!(next);
|
|
//dbg!(d1);
|
|
//dbg!(d2);
|
|
//dbg!(cross);
|
|
//dbg!(angle);
|
|
//dbg!(deg);
|
|
|
|
//println!("deg: {deg}");
|
|
|
|
let nb_add = (self.coef * (1. - angle / PI)) as usize;
|
|
|
|
for _ in 0..nb_add {}
|
|
}
|
|
|
|
v.push(node); // push node
|
|
}
|
|
v.push(point_list[point_list.len() - 1]); // push last
|
|
|
|
v
|
|
}
|
|
}
|