Libove Blog

Personal Blog about anything - mostly programming, cooking and random thoughts

I made a small improvement to the corridor curve sampling to create an equidistant sampling.

        let t_samples = 100;

        // determine length of path
        let path_len = {
            let mut l = 0.0;
            let mut prev_point = control_a;
            for t in 1..=t_samples {
                let t = t as f32 / t_samples as f32;
                let point = corridor.sample(t);
                l += point.pos.dist(&prev_point);
                prev_point = point.pos;
            }
            l
        };
        // determine spacing based on a desired spacing
        // E.g. if we want 1.0 spacing but the curve is 1.1 long,
        // a naive approach would result in a 0.1 segment at the end.
        // Instead we want a 1.1 segement or a 0.55 segment
        let desired_spacing = 1.0;
        let spacing = {
            let needed_steps = path_len / desired_spacing;
            let low = needed_steps.floor().max(1.0);
            let high = needed_steps.ceil();
            let low_step = path_len / low;
            let high_step = path_len / high;

            if (low_step - desired_spacing).abs() <= (high_step - desired_spacing).abs() {
                low_step
            } else {
                high_step
            }
        };

        let mut dist = 0.0;
        let mut prev_dist_point = control_a;
        for t in 1..t_samples {
            let t = t as f32 / t_samples as f32;
            let point = corridor.sample(t);
            dist += point.pos.dist(&prev_dist_point);
            prev_dist_point = point.pos;

            if dist >= spacing {
                 // create sample point
            }
        }

Screenshot showing 2D mesh of a room/dungeon design

#gamedev #rust #geometry





Interactions

Reposted by Red the Vampire

Liked by Red the Vampire