different way of giving clusters an x, y, z

This commit is contained in:
Dylan Knutson
2024-12-28 03:11:37 +00:00
parent 32a7292481
commit 9b4316e819

View File

@@ -104,26 +104,45 @@ async fn main() -> Result<()> {
let mut cluster_centers = Vec::new();
// Base vertices of a regular octahedron
// These vertices form three orthogonal golden rectangles
let phi = (1.0 + 5.0_f64.sqrt()) / 2.0; // golden ratio
let scale = 2.0;
let base_centers = vec![
vec![1.0, 0.0, 0.0], // +x
vec![-1.0, 0.0, 0.0], // -x
vec![0.0, 1.0, 0.0], // +y
vec![0.0, -1.0, 0.0], // -y
vec![0.0, 0.0, 1.0], // +z
vec![0.0, 0.0, -1.0], // -z
vec![1.0, phi, 0.0], // front top
vec![-1.0, phi, 0.0], // front bottom
vec![1.0, -phi, 0.0], // back top
vec![-1.0, -phi, 0.0], // back bottom
vec![phi, 0.0, 1.0], // right top
vec![-phi, 0.0, 1.0], // left top
vec![phi, 0.0, -1.0], // right bottom
vec![-phi, 0.0, -1.0], // left bottom
vec![0.0, 1.0, phi], // front right
vec![0.0, -1.0, phi], // back right
vec![0.0, 1.0, -phi], // front left
vec![0.0, -1.0, -phi], // back left
];
// Scale factor to control separation
let scale = 2.0;
// Normalize and scale the vectors to ensure equal distances
let base_centers: Vec<Vec<f64>> = base_centers
.into_iter()
.map(|v| {
let norm = (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]).sqrt();
vec![
v[0] / norm * scale,
v[1] / norm * scale,
v[2] / norm * scale,
]
})
.collect();
// Add jittered versions of the base centers
// Take the first n centers needed
for i in 0..args.item_clusters as usize {
let base = &base_centers[i % base_centers.len()];
// Add controlled random jitter (up to 10% of the scale)
let jitter = 0.1;
let x = base[0] * scale + (rng.gen::<f64>() - 0.5) * jitter * scale;
let y = base[1] * scale + (rng.gen::<f64>() - 0.5) * jitter * scale;
let z = base[2] * scale + (rng.gen::<f64>() - 0.5) * jitter * scale;
// Add very small jitter (1% of scale) to make it more natural
let jitter = 0.01;
let x = base[0] + (rng.gen::<f64>() - 0.5) * jitter * scale;
let y = base[1] + (rng.gen::<f64>() - 0.5) * jitter * scale;
let z = base[2] + (rng.gen::<f64>() - 0.5) * jitter * scale;
cluster_centers.push(vec![x, y, z]);
}