1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-05 14:27:45 +02:00

use isobands

This commit is contained in:
Justin Lin
2020-03-22 17:37:40 +08:00
parent 7ec1deb33a
commit 0ec8001a43

View File

@@ -116,35 +116,20 @@ module image_slicer(levels, level_step, contour_width) {
max_h = (floor(255 / level_step) + 1) * level_step; max_h = (floor(255 / level_step) + 1) * level_step;
module contour_lines(points, z, contour_width) { module contours(points, z, contour_width) {
for(row = marching_squares(points, z)) { union() {
for(line = row) { for(row = marching_squares(points, [0, z])) {
hull_polyline2d(line, width = contour_width); for(iso_band = row) {
polygon([for(p = iso_band) [p[0], p[1]]]);
}
} }
} }
} }
/*
Even though we can calculate isobands using [the algorithm](https://en.wikipedia.org/wiki/Marching_squares#Isoband),
it's easier to fill pixels when the z value of the point is lower than the z parameter.
*/
module simple_isobands(points, z) {
for(row = points) {
for(p = row) {
if(p[2] < z) {
translate([p[0], p[1]])
square(1, center = true);
}
}
}
}
for(z = [level_step:level_step:255]) { for(z = [level_step:level_step:255]) {
linear_extrude((max_h - z) / level_step) linear_extrude((max_h - z) / level_step)
union() { offset(0.01) // Avoid warning
contour_lines(points, z, contour_width); contours(points, z, contour_width);
simple_isobands(points, z);
}
} }
} }