Add better support for screen resizing
This commit is contained in:
parent
2033cb8156
commit
e96e413c39
107
src/main.rs
107
src/main.rs
|
@ -1,7 +1,7 @@
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
|
use macroquad::prelude::set_camera;
|
||||||
use macroquad::prelude::DVec2;
|
use macroquad::prelude::DVec2;
|
||||||
use macroquad::prelude::Rect;
|
|
||||||
use macroquad::prelude::Camera2D;
|
use macroquad::prelude::Camera2D;
|
||||||
use core::mem::swap;
|
use core::mem::swap;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -39,12 +39,22 @@ const HILITE: bool = false;
|
||||||
#[macroquad::main("BasicShapes")]
|
#[macroquad::main("BasicShapes")]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let mut dd = DelaunayDemo::default();
|
let mut dd = DelaunayDemo::default();
|
||||||
|
let mut camera = dd.get_camera();
|
||||||
|
set_camera(&camera);
|
||||||
|
let mut iter = 0;
|
||||||
loop {
|
loop {
|
||||||
|
if iter == 100 {
|
||||||
|
iter = 0;
|
||||||
|
dd.resize((screen_width()/screen_height()) as f64);
|
||||||
|
camera = dd.get_camera();
|
||||||
|
set_camera(&mut camera);
|
||||||
|
}
|
||||||
|
|
||||||
if is_mouse_button_pressed(MouseButton::Left) {
|
if is_mouse_button_pressed(MouseButton::Left) {
|
||||||
dd.click(mouse_position().into())
|
dd.click(camera.screen_to_world(mouse_position().into()));
|
||||||
}
|
}
|
||||||
if is_mouse_button_pressed(MouseButton::Right) {
|
if is_mouse_button_pressed(MouseButton::Right) {
|
||||||
let mouse_position: Vec2 = mouse_position().into();
|
let mouse_position: Vec2 = camera.screen_to_world(mouse_position().into());
|
||||||
|
|
||||||
println!("{}", mouse_position);
|
println!("{}", mouse_position);
|
||||||
|
|
||||||
|
@ -59,9 +69,13 @@ async fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_background(BG);
|
||||||
dd.update();
|
dd.update();
|
||||||
//dd.draw_delaunay();
|
//dd.draw_delaunay();
|
||||||
dd.draw_voronoi();
|
dd.draw_voronoi();
|
||||||
|
|
||||||
|
iter += 1;
|
||||||
next_frame().await;
|
next_frame().await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,7 +85,9 @@ pub struct DelaunayDemo {
|
||||||
pub triangles: Vec<Triangle>,
|
pub triangles: Vec<Triangle>,
|
||||||
adjacency: HashMap<Edge, (NeighborOne, NeighborTwo)>,
|
adjacency: HashMap<Edge, (NeighborOne, NeighborTwo)>,
|
||||||
poisoned: bool,
|
poisoned: bool,
|
||||||
random_state: u128
|
random_state: u128,
|
||||||
|
width: f64,
|
||||||
|
height: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -123,13 +139,13 @@ impl NeighborTwo {
|
||||||
|
|
||||||
impl Default for DelaunayDemo {
|
impl Default for DelaunayDemo {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let height = screen_height() as f64;
|
const HEIGHT: f64 = 900.0;
|
||||||
let width = screen_width() as f64;
|
const WIDTH: f64 = 1200.0;
|
||||||
let nodes: Vec<NodeRef> = vec![
|
let nodes: Vec<NodeRef> = vec![
|
||||||
Arc::new(Cell::new((-5.0 - BOING_RADIUS, 0.0 - BOING_RADIUS).into())),
|
Arc::new(Cell::new((-5.0 - BOING_RADIUS, 0.0 - BOING_RADIUS).into())),
|
||||||
Arc::new(Cell::new((0.0 - BOING_RADIUS, height + BOING_RADIUS).into())),
|
Arc::new(Cell::new((0.0 - BOING_RADIUS, HEIGHT + BOING_RADIUS).into())),
|
||||||
Arc::new(Cell::new((width + BOING_RADIUS, 0.0 - BOING_RADIUS).into())),
|
Arc::new(Cell::new((WIDTH + BOING_RADIUS, 0.0 - BOING_RADIUS).into())),
|
||||||
Arc::new(Cell::new((width + BOING_RADIUS, height + BOING_RADIUS).into())),
|
Arc::new(Cell::new((WIDTH + BOING_RADIUS, HEIGHT + BOING_RADIUS).into())),
|
||||||
];
|
];
|
||||||
let edges = (
|
let edges = (
|
||||||
Edge(nodes[2].clone(), nodes[0].clone()),
|
Edge(nodes[2].clone(), nodes[0].clone()),
|
||||||
|
@ -153,8 +169,14 @@ impl Default for DelaunayDemo {
|
||||||
(edges.3, (Border, (&triangles[1]).into())),
|
(edges.3, (Border, (&triangles[1]).into())),
|
||||||
(edges.4, (Border, (&triangles[1]).into())),
|
(edges.4, (Border, (&triangles[1]).into())),
|
||||||
].into();
|
].into();
|
||||||
let mut dd = DelaunayDemo {
|
let dd = DelaunayDemo {
|
||||||
nodes, adjacency, triangles, random_state: 1312_1312_1312, poisoned: false,
|
nodes,
|
||||||
|
adjacency,
|
||||||
|
triangles,
|
||||||
|
height: HEIGHT,
|
||||||
|
width: WIDTH,
|
||||||
|
random_state: 1312_1312_1312,
|
||||||
|
poisoned: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*let n_v_nodes = ((height / 50.0) - 1.0).round();
|
/*let n_v_nodes = ((height / 50.0) - 1.0).round();
|
||||||
|
@ -443,8 +465,50 @@ impl fmt::Debug for Triangle {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DelaunayDemo {
|
impl DelaunayDemo {
|
||||||
|
pub fn get_camera(&self) -> Camera2D {
|
||||||
|
|
||||||
|
let width = self.width as f32;
|
||||||
|
let height = self.height as f32;
|
||||||
|
|
||||||
|
Camera2D {
|
||||||
|
target: Vec2::new(width / 2.0, height / 2.0),
|
||||||
|
zoom: Vec2::new(2./width, 2./height),
|
||||||
|
.. Default::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn resize(&mut self, aspect_ratio: f64) {
|
||||||
|
let minimum_dimension = f64::min(self.width, self.height);
|
||||||
|
let (new_width, new_height) = if aspect_ratio < 1.0 {
|
||||||
|
(minimum_dimension, minimum_dimension / aspect_ratio)
|
||||||
|
} else {
|
||||||
|
(minimum_dimension * aspect_ratio, minimum_dimension)
|
||||||
|
};
|
||||||
|
|
||||||
|
let resize_factor = DVec2::new(
|
||||||
|
new_width / self.width,
|
||||||
|
new_height / self.height,
|
||||||
|
);
|
||||||
|
|
||||||
|
if resize_factor != DVec2::ONE {
|
||||||
|
|
||||||
|
for node in &self.nodes {
|
||||||
|
let mut node_inner = node.get();
|
||||||
|
node_inner.0 *= resize_factor;
|
||||||
|
node.set(node_inner);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.width = new_width;
|
||||||
|
self.height = new_height;
|
||||||
|
|
||||||
|
if let Err(msg) = self.re_delaunize() {
|
||||||
|
eprintln!("POISONED: {}", msg);
|
||||||
|
self.poisoned = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn draw_delaunay(&self) {
|
fn draw_delaunay(&self) {
|
||||||
clear_background(BG);
|
|
||||||
let mut highlight_segments = Vec::new();
|
let mut highlight_segments = Vec::new();
|
||||||
for triangle in &self.triangles {
|
for triangle in &self.triangles {
|
||||||
let (c, r) = triangle.circumcenter();
|
let (c, r) = triangle.circumcenter();
|
||||||
|
@ -467,10 +531,10 @@ impl DelaunayDemo {
|
||||||
let edge_1 = edge.1.get().as_f32();
|
let edge_1 = edge.1.get().as_f32();
|
||||||
|
|
||||||
if
|
if
|
||||||
edge_0.x < 0.0 || edge_0.x > screen_width()
|
edge_0.x < 0.0 || edge_0.x > self.width as f32
|
||||||
|| edge_0.y < 0.0 || edge_0.y > screen_height()
|
|| edge_0.y < 0.0 || edge_0.y > self.height as f32
|
||||||
|| edge_1.x < 0.0 || edge_1.x > screen_width()
|
|| edge_1.x < 0.0 || edge_1.x > self.width as f32
|
||||||
|| edge_1.y < 0.0 || edge_1.y > screen_height()
|
|| edge_1.y < 0.0 || edge_1.y > self.height as f32
|
||||||
{
|
{
|
||||||
continue; //don't draw container nodes
|
continue; //don't draw container nodes
|
||||||
}
|
}
|
||||||
|
@ -489,7 +553,6 @@ impl DelaunayDemo {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_voronoi(&self) {
|
fn draw_voronoi(&self) {
|
||||||
clear_background(BG);
|
|
||||||
for neighbors in self.adjacency.values() {
|
for neighbors in self.adjacency.values() {
|
||||||
if let (Occupant(tri1), Friend(tri2)) = neighbors {
|
if let (Occupant(tri1), Friend(tri2)) = neighbors {
|
||||||
let (center1, _) = tri1.circumcenter();
|
let (center1, _) = tri1.circumcenter();
|
||||||
|
@ -677,18 +740,16 @@ impl DelaunayDemo {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for a bounce
|
// Check for a bounce
|
||||||
let height = screen_height() as f64;
|
if node_inner.0.y > self.height {
|
||||||
let width = screen_width() as f64;
|
node_inner.0.y = 2.0 * self.height - node_inner.0.y;
|
||||||
if node_inner.0.y > height {
|
|
||||||
node_inner.0.y = 2.0 * height - node_inner.0.y;
|
|
||||||
node_inner.1.y = -node_inner.1.y;
|
node_inner.1.y = -node_inner.1.y;
|
||||||
}
|
}
|
||||||
if node_inner.0.y < 0.0 {
|
if node_inner.0.y < 0.0 {
|
||||||
node_inner.0.y = -node_inner.0.y;
|
node_inner.0.y = -node_inner.0.y;
|
||||||
node_inner.1.y = -node_inner.1.y;
|
node_inner.1.y = -node_inner.1.y;
|
||||||
}
|
}
|
||||||
if node_inner.0.x > width {
|
if node_inner.0.x > self.width {
|
||||||
node_inner.0.x = 2.0 * width - node_inner.0.x;
|
node_inner.0.x = 2.0 * self.width - node_inner.0.x;
|
||||||
node_inner.1.x = -node_inner.1.x;
|
node_inner.1.x = -node_inner.1.x;
|
||||||
}
|
}
|
||||||
if node_inner.0.x < 0.0 {
|
if node_inner.0.x < 0.0 {
|
||||||
|
|
Loading…
Reference in New Issue