Colorful voronoi cells
This commit is contained in:
parent
acd4a62d08
commit
ffbdb33659
3 changed files with 51 additions and 41 deletions
40
Cargo.lock
generated
40
Cargo.lock
generated
|
|
@ -2377,8 +2377,6 @@ version = "0.15.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
|
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"allocator-api2",
|
|
||||||
"equivalent",
|
|
||||||
"foldhash",
|
"foldhash",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -2710,6 +2708,15 @@ dependencies = [
|
||||||
"regex-automata 0.1.10",
|
"regex-automata 0.1.10",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "maybe_parallel_iterator"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5069b219d51d2ba2d9388623bd7eead5d4e7974bc8ff3ec9edbe36b09c0ef477"
|
||||||
|
dependencies = [
|
||||||
|
"rayon",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.7.4"
|
version = "2.7.4"
|
||||||
|
|
@ -2892,7 +2899,7 @@ dependencies = [
|
||||||
"bevy",
|
"bevy",
|
||||||
"bevy_vello",
|
"bevy_vello",
|
||||||
"rand 0.9.0",
|
"rand 0.9.0",
|
||||||
"spade",
|
"voronator",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -3684,12 +3691,6 @@ version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
|
checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "robust"
|
|
||||||
version = "1.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cbf4a6aa5f6d6888f39e980649f3ad6b666acdce1d78e95b8a2cb076e687ae30"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rodio"
|
name = "rodio"
|
||||||
version = "0.19.0"
|
version = "0.19.0"
|
||||||
|
|
@ -3963,18 +3964,6 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "spade"
|
|
||||||
version = "2.13.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1ece03ff43cd2a9b57ebf776ea5e78bd30b3b4185a619f041079f4109f385034"
|
|
||||||
dependencies = [
|
|
||||||
"hashbrown 0.15.2",
|
|
||||||
"num-traits",
|
|
||||||
"robust",
|
|
||||||
"smallvec",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spirv"
|
name = "spirv"
|
||||||
version = "0.3.0+sdk-1.3.268.0"
|
version = "0.3.0+sdk-1.3.268.0"
|
||||||
|
|
@ -4517,6 +4506,15 @@ version = "0.9.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "voronator"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "07d8e6fe4b9b3b443f2e4ada327cf4b08ab5cdd27a42cd5c9f38dd29092c10ee"
|
||||||
|
dependencies = [
|
||||||
|
"maybe_parallel_iterator",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "walkdir"
|
name = "walkdir"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,4 @@ opt-level = 3
|
||||||
bevy = "0.15.3"
|
bevy = "0.15.3"
|
||||||
bevy_vello = "0.7.1"
|
bevy_vello = "0.7.1"
|
||||||
rand = "0.9.0"
|
rand = "0.9.0"
|
||||||
spade = "2.13.1"
|
voronator = "0.2.1"
|
||||||
|
|
|
||||||
50
src/main.rs
50
src/main.rs
|
|
@ -1,7 +1,11 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_vello::{prelude::*, vello::kurbo::{Point, Stroke}, VelloPlugin};
|
use bevy_vello::{
|
||||||
|
VelloPlugin,
|
||||||
|
prelude::*,
|
||||||
|
vello::kurbo::{PathEl, Point},
|
||||||
|
};
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use spade::{DelaunayTriangulation, Point2, Triangulation, handles::VoronoiVertex};
|
use voronator::VoronoiDiagram;
|
||||||
use std::ops::DerefMut;
|
use std::ops::DerefMut;
|
||||||
|
|
||||||
const JITTER: f64 = 0.5;
|
const JITTER: f64 = 0.5;
|
||||||
|
|
@ -23,33 +27,41 @@ fn setup_vector_graphics(mut commands: Commands) {
|
||||||
fn draw_map(mut query_scene: Single<(&mut Transform, &mut VelloScene)>) {
|
fn draw_map(mut query_scene: Single<(&mut Transform, &mut VelloScene)>) {
|
||||||
let (transform, scene) = query_scene.deref_mut();
|
let (transform, scene) = query_scene.deref_mut();
|
||||||
scene.reset();
|
scene.reset();
|
||||||
transform.scale = Vec3::ONE * 25.0;
|
transform.scale = Vec3::ONE * 30.0;
|
||||||
|
|
||||||
let mut triangulation: DelaunayTriangulation<_> = DelaunayTriangulation::new();
|
|
||||||
let mut rng = rand::rng();
|
let mut rng = rand::rng();
|
||||||
|
let mut points = Vec::new();
|
||||||
for x in -20..=20 {
|
for x in -20..=20 {
|
||||||
for y in -10..=10 {
|
for y in -10..=10 {
|
||||||
triangulation.insert(Point2::new(
|
points.push((
|
||||||
(x as f64) + rng.random_range(-JITTER..=JITTER),
|
(x as f64) + rng.random_range(-JITTER..=JITTER),
|
||||||
(y as f64) + rng.random_range(-JITTER..=JITTER),
|
(y as f64) + rng.random_range(-JITTER..=JITTER),
|
||||||
)).unwrap();
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let diagram = VoronoiDiagram::<voronator::delaunator::Point>::from_tuple(&(-20.0, -10.0), &(20.0, 10.0), &points).unwrap();
|
||||||
|
|
||||||
for edge in triangulation.undirected_voronoi_edges() {
|
for cell in diagram.cells() {
|
||||||
match edge.vertices() {
|
let mut first = true;
|
||||||
[VoronoiVertex::Inner(from), VoronoiVertex::Inner(to)] => {
|
let mut path = Vec::new();
|
||||||
let from = from.circumcenter();
|
for point in cell.points() {
|
||||||
let to = to.circumcenter();
|
let point = Point::new(point.x, point.y);
|
||||||
scene.stroke(
|
if first {
|
||||||
&Stroke::new(0.1),
|
first = false;
|
||||||
kurbo::Affine::default(),
|
path.push(PathEl::MoveTo(point));
|
||||||
peniko::Color::WHITE,
|
} else {
|
||||||
None,
|
path.push(PathEl::LineTo(point));
|
||||||
&kurbo::Line::new(Point::new(from.x, from.y), Point::new(to.x, to.y)),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
|
let r = rng.random_range(0..=255);
|
||||||
|
let g = rng.random_range(0..=255);
|
||||||
|
let b = rng.random_range(0..=255);
|
||||||
|
scene.fill(
|
||||||
|
peniko::Fill::NonZero,
|
||||||
|
kurbo::Affine::default(),
|
||||||
|
peniko::Color::from_rgb8(r, g, b),
|
||||||
|
None,
|
||||||
|
&kurbo::BezPath::from_vec(path),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue