Skip to content

Commit 1ed5e24

Browse files
committed
it works! finding the segment index is linear now!
1 parent 0170d8f commit 1ed5e24

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,25 @@ pub fn sample_points_on_bezpath(bezpath: BezPath, spacing: f64, start_offset: f6
5353
}
5454
// Generate points along the path based on calculated intervals.
5555
let max_c = count as usize;
56+
let mut length_upto_previous_segment = 0.;
57+
let mut next_segment_index = 0;
5658

5759
for c in 0..=max_c {
5860
let fraction = c as f64 / count;
59-
let current_length = fraction * used_length + start_offset;
60-
let t = current_length / total_length;
61-
let point = position_on_bezpath(&bezpath, t, true, Some(segments_length));
61+
let c_next_length = fraction * used_length + start_offset;
62+
let mut next_length = c_next_length - length_upto_previous_segment;
63+
let mut next_segment_length = segments_length[next_segment_index];
64+
65+
while next_length > next_segment_length && (next_length - next_segment_length) > 1e-7 {
66+
next_segment_index += 1;
67+
length_upto_previous_segment += next_segment_length;
68+
next_length = c_next_length - length_upto_previous_segment;
69+
next_segment_length = segments_length[next_segment_index];
70+
}
71+
72+
let t = next_length / next_segment_length;
73+
74+
let point = bezpath.get_seg(next_segment_index + 1).unwrap().eval(t);
6275

6376
if sample_bezpath.elements().is_empty() {
6477
sample_bezpath.move_to(point)

0 commit comments

Comments
 (0)