different way of giving clusters an x, y, z
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user