diff --git a/src/lib.rs b/src/lib.rs index d134e5f..5199282 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,8 @@ use delaunator::{triangulate, Point as DelaunatorPoint}; use geo::{Point as GeoPoint, Coord}; use rand::Rng; -use rayon::prelude::*; use std::cmp::{min, max}; use std::collections::{HashMap, HashSet}; -use std::sync::{Arc, Mutex}; #[derive(Debug, Clone, Copy)] pub struct Point { @@ -215,6 +213,33 @@ impl Xenobalanus { }).collect() } + pub fn triangle_edges(&self) -> Vec<(usize, usize)> { + let triangles = self.triangle_vertices(); + let mut edges_set = HashSet::new(); + + for triangle in triangles { + // Generate edges from the triangle vertices + let edges = vec![ + (triangle[0], triangle[1]), + (triangle[1], triangle[2]), + (triangle[2], triangle[0]), + ]; + + for mut edge in edges { + // Normalize the edge to ensure consistency in representation + if edge.0 > edge.1 { + edge = (edge.1, edge.0); + } + + // Insert into the HashSet to ensure uniqueness + edges_set.insert(edge); + } + } + + // Convert the HashSet back into a Vec and return + edges_set.into_iter().collect() + } + pub fn triangle_coordinates(&self) -> Vec> { self.triangulation.chunks(3).map(|chunk| { chunk.iter().map(|&index| { @@ -259,17 +284,19 @@ impl Xenobalanus { } pub fn preprocess(&mut self, types: usize) { - let geometry_data = Arc::new(Mutex::new(GeometryData::new())); + // let geometry_data = Arc::new(Mutex::new(GeometryData::new())); + // self.triangulation.par_chunks(3).enumerate().for_each(|(index, tri_idx)| { + // let gd = geometry_data.clone(); // Clone Arc for use in each thread, not the data itself - self.triangulation.par_chunks(3).enumerate().for_each(|(index, tri_idx)| { - let gd = geometry_data.clone(); // Clone Arc for use in each thread, not the data itself + // // Perform locked update + // let mut gd_lock = gd.lock().unwrap(); + // gd_lock.add_triangle(index, &self.points, tri_idx, types); + // }); - // Perform locked update - let mut gd_lock = gd.lock().unwrap(); - gd_lock.add_triangle(index, &self.points, tri_idx, types); + // self.geometry_data = Arc::try_unwrap(geometry_data).unwrap().into_inner().unwrap(); + self.triangulation.chunks(3).enumerate().for_each(|(index, tri_idx)| { + self.geometry_data.add_triangle(index, &self.points, tri_idx, types); }); - - self.geometry_data = Arc::try_unwrap(geometry_data).unwrap().into_inner().unwrap(); } pub fn delfin(