use pasture_algorithms::segmentation::{
ransac_line_par, ransac_line_serial, ransac_plane_par, ransac_plane_serial,
};
use pasture_core::{
containers::{BorrowedMutBufferExt, HashMapBuffer},
layout::attributes::INTENSITY,
nalgebra::Vector3,
};
use pasture_derive::PointType;
use rand::Rng;
#[repr(C, packed)]
#[derive(PointType, Debug, Copy, Clone, bytemuck::AnyBitPattern, bytemuck::NoUninit)]
pub struct SimplePoint {
#[pasture(BUILTIN_POSITION_3D)]
pub position: Vector3<f64>,
#[pasture(BUILTIN_INTENSITY)]
pub intensity: u16,
}
fn main() {
let mut buffer = (0..20000)
.map(|p| {
let mut rng = rand::thread_rng();
let mut point = SimplePoint {
position: Vector3::new(rng.gen_range(0.0..100.0), rng.gen_range(0.0..100.0), 1.0),
intensity: 1,
};
if p % 4 == 0 {
point.position = Vector3::new(0.0, 0.0, rng.gen_range(0.0..200.0));
}
if p % 50 == 0 {
let position = point.position;
point.position = Vector3::new(position.x, position.y, rng.gen_range(-50.0..50.2));
}
point
})
.collect::<HashMapBuffer>();
println!("done generating pointcloud");
let plane_and_points = ransac_plane_par(&buffer, 0.01, 50);
println!("done ransac_plane");
println!("{:?}", plane_and_points.0);
let plane_and_points_ser = ransac_plane_serial(&buffer, 0.01, 50);
println!("done ransac_plane_ser");
println!("{:?}", plane_and_points_ser.0);
let line_and_points = ransac_line_par(&buffer, 0.01, 50);
println!("done ransac_line");
println!("{:?}", line_and_points.0);
let line_and_points_ser = ransac_line_serial(&buffer, 0.01, 50);
println!("done ransac_line_ser");
println!("{:?}", line_and_points_ser.0);
for (index, intensity) in buffer
.view_attribute_mut::<u16>(&INTENSITY)
.iter_mut()
.enumerate()
{
if line_and_points.1.contains(&index) {
*intensity = 500;
} else if plane_and_points.1.contains(&index) {
*intensity = 700;
} else {
*intensity = 300;
}
}
println!("changed intensity");
}