mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-09-25 22:09:12 +02:00
use [each lt, v] to replace concat(lt, [v])
This commit is contained in:
@@ -34,16 +34,16 @@ function m_assign(m, i, j, v) =
|
|||||||
lt = m[i],
|
lt = m[i],
|
||||||
leng_lt = len(lt),
|
leng_lt = len(lt),
|
||||||
nlt = [
|
nlt = [
|
||||||
each (j == 0 ? [] : [for(idx = [0:j - 1]) lt[idx]]),
|
if(j != 0) each [for(idx = [0:j - 1]) lt[idx]],
|
||||||
v,
|
v,
|
||||||
each (j == leng_lt - 1 ? [] : [for(idx = [j + 1:leng_lt - 1]) lt[idx]])
|
if(j != leng_lt - 1) each [for(idx = [j + 1:leng_lt - 1]) lt[idx]]
|
||||||
],
|
],
|
||||||
leng_m = len(m)
|
leng_m = len(m)
|
||||||
)
|
)
|
||||||
[
|
[
|
||||||
each (i == 0 ? [] : [for(idx = [0:i - 1]) m[idx]]),
|
if(i != 0) each [for(idx = [0:i - 1]) m[idx]],,
|
||||||
nlt,
|
nlt,
|
||||||
each (i == leng_m - 1 ? [] : [for(idx = [i + 1:leng_m - 1]) m[idx]])
|
if(i != leng_m - 1) each [for(idx = [i + 1:leng_m - 1]) m[idx]]
|
||||||
];
|
];
|
||||||
|
|
||||||
function next_vis(i, pts, cur_faces, cur_faces_leng, next, vis, j = 0) =
|
function next_vis(i, pts, cur_faces, cur_faces_leng, next, vis, j = 0) =
|
||||||
|
@@ -11,10 +11,7 @@ function _find_radians(b, point_distance, radians, n, count = 1) =
|
|||||||
_find_radians(
|
_find_radians(
|
||||||
b,
|
b,
|
||||||
point_distance,
|
point_distance,
|
||||||
concat(
|
[each radians, pre_radians + _radian_step(b, pre_radians, point_distance)],
|
||||||
radians,
|
|
||||||
[pre_radians + _radian_step(b, pre_radians, point_distance)]
|
|
||||||
),
|
|
||||||
n,
|
n,
|
||||||
count + 1)
|
count + 1)
|
||||||
);
|
);
|
||||||
|
@@ -54,11 +54,5 @@ function _bezier_curve_point3(t, points) =
|
|||||||
function _bezier_curve_impl(t_step, points) =
|
function _bezier_curve_impl(t_step, points) =
|
||||||
let(t_end = ceil(1 / t_step))
|
let(t_end = ceil(1 / t_step))
|
||||||
len(points[0]) == 3 ?
|
len(points[0]) == 3 ?
|
||||||
concat([
|
[each [for(t = 0; t < t_end; t = t + 1) _bezier_curve_point3(t * t_step, points)], _bezier_curve_point3(1, points)] :
|
||||||
for(t = 0; t < t_end; t = t + 1)
|
[each [for(t = 0; t < t_end; t = t + 1) _bezier_curve_point2(t * t_step, points)], _bezier_curve_point2(1, points)];
|
||||||
_bezier_curve_point3(t * t_step, points)
|
|
||||||
], [_bezier_curve_point3(1, points)]) :
|
|
||||||
concat([
|
|
||||||
for(t = 0; t < t_end; t = t + 1)
|
|
||||||
_bezier_curve_point2(t * t_step, points)
|
|
||||||
], [_bezier_curve_point2(1, points)]);
|
|
||||||
|
@@ -54,11 +54,6 @@ function _bezier_smooth_impl(path_pts, round_d, t_step, closed, angle_threshold)
|
|||||||
[pts[leng - 2], pts[leng - 1], pts[0]],
|
[pts[leng - 2], pts[leng - 1], pts[0]],
|
||||||
round_d, t_step, 3, angle_threshold
|
round_d, t_step, 3, angle_threshold
|
||||||
)
|
)
|
||||||
) :
|
) : [pts[0], each middle_pts, pts[leng - 1]]
|
||||||
concat(
|
|
||||||
[pts[0]],
|
|
||||||
middle_pts,
|
|
||||||
[pts[leng - 1]]
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
len(path_pts[0]) == 2 ? [for(p = pth_pts) __to2d(p)] : pth_pts;
|
len(path_pts[0]) == 2 ? [for(p = pth_pts) __to2d(p)] : pth_pts;
|
@@ -40,9 +40,9 @@ function _bijection_offset_impl(pts, d, epsilon) =
|
|||||||
leng_minus_one = leng - 1,
|
leng_minus_one = leng - 1,
|
||||||
last_p = __line_intersection2(offset_es[leng_minus_one], offset_es[0], epsilon)
|
last_p = __line_intersection2(offset_es[leng_minus_one], offset_es[0], epsilon)
|
||||||
)
|
)
|
||||||
concat(
|
|
||||||
last_p != [] && last_p == last_p ? [last_p] : [],
|
|
||||||
[
|
[
|
||||||
|
if(last_p != [] && last_p == last_p) last_p,
|
||||||
|
each [
|
||||||
for(i = 0; i < leng_minus_one; i = i + 1)
|
for(i = 0; i < leng_minus_one; i = i + 1)
|
||||||
let(
|
let(
|
||||||
this_edge = offset_es[i],
|
this_edge = offset_es[i],
|
||||||
@@ -53,5 +53,5 @@ function _bijection_offset_impl(pts, d, epsilon) =
|
|||||||
)
|
)
|
||||||
p
|
p
|
||||||
]
|
]
|
||||||
);
|
];
|
||||||
|
|
@@ -54,7 +54,7 @@ function _bspline_curve_interpolate(t, degree, points, knots, weights) =
|
|||||||
v = [
|
v = [
|
||||||
for(i = 0; i < n; i = i + 1)
|
for(i = 0; i < n; i = i + 1)
|
||||||
let(p = points[i] * wts[i])
|
let(p = points[i] * wts[i])
|
||||||
concat([for(j = 0; j < d; j = j + 1) p[j]], [wts[i]])
|
[each [for(j = 0; j < d; j = j + 1) p[j]], wts[i]]
|
||||||
],
|
],
|
||||||
ts = _bspline_curve_ts(t, degree, kts),
|
ts = _bspline_curve_ts(t, degree, kts),
|
||||||
s = ts[1],
|
s = ts[1],
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
function _midpt_smooth_sub(points, iend, closed) =
|
function _midpt_smooth_sub(points, iend, closed) =
|
||||||
concat(
|
|
||||||
[
|
[
|
||||||
|
each [
|
||||||
for(i = 0; i < iend; i = i + 1)
|
for(i = 0; i < iend; i = i + 1)
|
||||||
(points[i] + points[i + 1]) / 2
|
(points[i] + points[i + 1]) / 2
|
||||||
],
|
],
|
||||||
closed ? [(points[iend] + points[0]) / 2] : []
|
if(closed) (points[iend] + points[0]) / 2
|
||||||
);
|
];
|
||||||
|
|
||||||
function _midpt_smooth_impl(points, n, closed) =
|
function _midpt_smooth_impl(points, n, closed) =
|
||||||
let(
|
let(
|
||||||
|
@@ -73,6 +73,6 @@ function _shape_path_extend_impl(stroke_pts, path_pts, scale, closed) =
|
|||||||
closed && path_pts[0] == path_pts[leng_path_pts - 1] ?
|
closed && path_pts[0] == path_pts[leng_path_pts - 1] ?
|
||||||
__polytransversals(concat(strokes, [strokes[0]])) :
|
__polytransversals(concat(strokes, [strokes[0]])) :
|
||||||
__polytransversals(
|
__polytransversals(
|
||||||
concat([_shape_path_first_stroke(stroke_pts, path_pts)], strokes)
|
[_shape_path_first_stroke(stroke_pts, path_pts), each strokes]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -23,13 +23,12 @@ function _trim_sub(lines, leng, epsilon) =
|
|||||||
inter_p = _trim_shape_any_intersection(lines_from_next2, current_line, leng_lines_from_next2, 0, epsilon)
|
inter_p = _trim_shape_any_intersection(lines_from_next2, current_line, leng_lines_from_next2, 0, epsilon)
|
||||||
)
|
)
|
||||||
// no intersecting pt, collect current_p and trim remain lines
|
// no intersecting pt, collect current_p and trim remain lines
|
||||||
inter_p == [] ? (concat([current_p], _trim_shape_trim_lines(lines_from_next, epsilon))) : (
|
inter_p == [] ? [current_p, each _trim_shape_trim_lines(lines_from_next, epsilon)]
|
||||||
|
: (
|
||||||
// collect current_p, intersecting pt and the last pt
|
// collect current_p, intersecting pt and the last pt
|
||||||
(leng == 3 || (inter_p.x == (leng_lines_from_next2 - 1))) ? [current_p, inter_p.y, lines[leng - 1]] : (
|
(leng == 3 || (inter_p.x == (leng_lines_from_next2 - 1))) ? [current_p, inter_p.y, lines[leng - 1]] : (
|
||||||
// collect current_p, intersecting pt and trim remain lines
|
// collect current_p, intersecting pt and trim remain lines
|
||||||
concat([current_p, inter_p.y],
|
[current_p, inter_p.y, each _trim_shape_trim_lines([for(i = inter_p.x + 1; i < leng_lines_from_next2; i = i + 1) lines_from_next2[i]], epsilon)]
|
||||||
_trim_shape_trim_lines([for(i = inter_p.x + 1; i < leng_lines_from_next2; i = i + 1) lines_from_next2[i]], epsilon)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -38,7 +37,7 @@ function _trim_shape_trim_lines(lines, epsilon) =
|
|||||||
leng > 2 ? _trim_sub(lines, leng, epsilon) : _trim_shape_collect_pts_from(lines, leng);
|
leng > 2 ? _trim_sub(lines, leng, epsilon) : _trim_shape_collect_pts_from(lines, leng);
|
||||||
|
|
||||||
function _trim_shape_collect_pts_from(lines, leng) =
|
function _trim_shape_collect_pts_from(lines, leng) =
|
||||||
concat([for(line = lines) line[0]], [lines[leng - 1][1]]);
|
[each [for(line = lines) line[0]], lines[leng - 1][1]];
|
||||||
|
|
||||||
function _trim_shape_impl(shape_pts, from, to, epsilon) =
|
function _trim_shape_impl(shape_pts, from, to, epsilon) =
|
||||||
let(
|
let(
|
||||||
|
@@ -18,10 +18,9 @@ function arc_path(radius, angle) =
|
|||||||
angles = is_num(angle) ? [0, angle] : angle,
|
angles = is_num(angle) ? [0, angle] : angle,
|
||||||
m = floor(angles[0] / a_step) + 1,
|
m = floor(angles[0] / a_step) + 1,
|
||||||
n = floor(angles[1] / a_step),
|
n = floor(angles[1] / a_step),
|
||||||
points = concat([__ra_to_xy(__edge_r_begin(radius, angles[0], a_step, m), angles[0])],
|
points = [
|
||||||
m > n ? [] : [
|
__ra_to_xy(__edge_r_begin(radius, angles[0], a_step, m), angles[0]),
|
||||||
for(i = m; i <= n; i = i + 1)
|
if(m <= n) each [for(i = m; i <= n; i = i + 1) __ra_to_xy(radius, a_step * i)],
|
||||||
__ra_to_xy(radius, a_step * i)
|
if(angles[1] != a_step * n) __ra_to_xy(__edge_r_end(radius, angles[1], a_step, n), angles[1])
|
||||||
],
|
]
|
||||||
angles[1] == a_step * n ? [] : [__ra_to_xy(__edge_r_end(radius, angles[1], a_step, n), angles[1])])
|
|
||||||
) points;
|
) points;
|
@@ -12,13 +12,13 @@ use <_impl/_catmull_rom_spline.scad>;
|
|||||||
|
|
||||||
function curve(t_step, points, tightness = 0) =
|
function curve(t_step, points, tightness = 0) =
|
||||||
let(leng = len(points))
|
let(leng = len(points))
|
||||||
concat(
|
|
||||||
[
|
[
|
||||||
|
each [
|
||||||
for(i = [0:leng - 4])
|
for(i = [0:leng - 4])
|
||||||
let(
|
let(
|
||||||
pts = _catmull_rom_spline_4pts(t_step, [for(j = [i:i + 3]) points[j]], tightness)
|
pts = _catmull_rom_spline_4pts(t_step, [for(j = [i:i + 3]) points[j]], tightness)
|
||||||
)
|
)
|
||||||
for(i = [0:len(pts) - 2]) pts[i]
|
for(i = [0:len(pts) - 2]) pts[i]
|
||||||
],
|
],
|
||||||
[points[leng - 2]]
|
points[leng - 2]
|
||||||
);
|
];
|
@@ -30,14 +30,8 @@ module ellipse_extrude(semi_minor_axis, height, center = false, convexity = 10,
|
|||||||
pre_f * f_extrude[i][0]
|
pre_f * f_extrude[i][0]
|
||||||
];
|
];
|
||||||
|
|
||||||
child_fs = concat([1], accm_fs);
|
child_fs = [1, each accm_fs];
|
||||||
pre_zs = concat(
|
pre_zs = [0, each [for(i = 0; i < len_f_extrude; i = i + 1) f_extrude[i][1]]];
|
||||||
[0],
|
|
||||||
[
|
|
||||||
for(i = 0; i < len_f_extrude; i = i + 1)
|
|
||||||
f_extrude[i][1]
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
module extrude() {
|
module extrude() {
|
||||||
for(i = [0:len_f_extrude - 1]) {
|
for(i = [0:len_f_extrude - 1]) {
|
||||||
|
@@ -91,7 +91,7 @@ function gyroid_points(pp, w)=
|
|||||||
// pp=number of rows
|
// pp=number of rows
|
||||||
function gyroid_faces(pp)=
|
function gyroid_faces(pp)=
|
||||||
let(zs=(pp+1)*(pp+1)) // starting index of down wall points
|
let(zs=(pp+1)*(pp+1)) // starting index of down wall points
|
||||||
concat( // calculate face index vetros for triangles of polyhedron
|
// calculate face index vetros for triangles of polyhedron
|
||||||
[ for(i=[0:pp-1]) // for every row
|
[ for(i=[0:pp-1]) // for every row
|
||||||
let(jm=i*(i+1)) // middle point index for current j vector
|
let(jm=i*(i+1)) // middle point index for current j vector
|
||||||
let(jfm=(i+1)*(i+2)) // middle point index for succeeding j vector
|
let(jfm=(i+1)*(i+2)) // middle point index for succeeding j vector
|
||||||
@@ -103,7 +103,7 @@ function gyroid_faces(pp)=
|
|||||||
let(p3=(l==0) ? jfm+(j+1)*k+dm : jm+(j+1)*k+dm)
|
let(p3=(l==0) ? jfm+(j+1)*k+dm : jm+(j+1)*k+dm)
|
||||||
if (j<i || l==0)
|
if (j<i || l==0)
|
||||||
((k==1 && m==0) || (k==-1 && m==1)) ? [p2, p1, p3] : [p1, p2, p3]
|
((k==1 && m==0) || (k==-1 && m==1)) ? [p2, p1, p3] : [p1, p2, p3]
|
||||||
]);
|
];
|
||||||
|
|
||||||
// Swaps x and y coordinate of all members in matrix m. Applied on a faces matrix for polyhedron creation, it swaps inside out.
|
// Swaps x and y coordinate of all members in matrix m. Applied on a faces matrix for polyhedron creation, it swaps inside out.
|
||||||
function swap_xy(m)=
|
function swap_xy(m)=
|
||||||
|
@@ -3,7 +3,7 @@ use <lines_intersection.scad>;
|
|||||||
function _intersection_ps(shape, line_pts, epsilon) =
|
function _intersection_ps(shape, line_pts, epsilon) =
|
||||||
let(
|
let(
|
||||||
leng = len(shape),
|
leng = len(shape),
|
||||||
pts = concat(shape, [shape[0]])
|
pts = [each shape, shape[0]]
|
||||||
)
|
)
|
||||||
[
|
[
|
||||||
for(i = [0:leng - 1])
|
for(i = [0:leng - 1])
|
||||||
|
@@ -252,13 +252,12 @@ function tilemap_generate(tm) =
|
|||||||
], x, y));
|
], x, y));
|
||||||
|
|
||||||
|
|
||||||
function neighbor_dirs(x, y, width, height) =
|
function neighbor_dirs(x, y, width, height) = [
|
||||||
concat(
|
if(x > 0) [-1, 0], // left
|
||||||
x > 0 ? [[-1, 0]] : [], // left
|
if(x < width - 1) [ 1, 0], // right
|
||||||
x < width - 1 ? [[ 1, 0]] : [], // right
|
if(y > 0) [ 0, -1], // top
|
||||||
y > 0 ? [[ 0, -1]] : [], // top
|
if(y < height - 1) [ 0, 1] // bottom
|
||||||
y < height - 1 ? [[ 0, 1]] : [] // bottom
|
];
|
||||||
);
|
|
||||||
|
|
||||||
function neighbor_compatibilities(sample, x, y, width, height) =
|
function neighbor_compatibilities(sample, x, y, width, height) =
|
||||||
let(me = sample[y][x])
|
let(me = sample[y][x])
|
||||||
|
@@ -7,7 +7,7 @@ function convex_intersection(shape1, shape2, epsilon = 0.0001) =
|
|||||||
(shape1 == [] || shape2 == []) ? [] :
|
(shape1 == [] || shape2 == []) ? [] :
|
||||||
let(
|
let(
|
||||||
leng = len(shape1),
|
leng = len(shape1),
|
||||||
pts = concat(shape1, [shape1[0]])
|
pts = [each shape1, shape1[0]]
|
||||||
)
|
)
|
||||||
convex_ct_clk_order(
|
convex_ct_clk_order(
|
||||||
concat(
|
concat(
|
||||||
|
@@ -29,7 +29,7 @@ module hollow_out_sweep(sections, diameter, closed = false, style = "LINES") {
|
|||||||
[[rect[0], rect[1], rect[2]], [rect[0], rect[2], rect[3]]] :
|
[[rect[0], rect[1], rect[2]], [rect[0], rect[2], rect[3]]] :
|
||||||
[[rect[1], rect[2], rect[3]], [rect[1], rect[3], rect[0]]];
|
[[rect[1], rect[2], rect[3]], [rect[1], rect[3], rect[0]]];
|
||||||
|
|
||||||
sects = closed ? concat(sections, [sections[0]]) : sections;
|
sects = closed ? [each sections, sections[0]] : sections;
|
||||||
lines = [
|
lines = [
|
||||||
for(rect = rects(sects))
|
for(rect = rects(sects))
|
||||||
for(tri = rand_tris(rect))
|
for(tri = rand_tris(rect))
|
||||||
|
@@ -67,9 +67,9 @@ function sub_dart(tile) =
|
|||||||
n_size = tile_size(tile) / PHI,
|
n_size = tile_size(tile) / PHI,
|
||||||
r = PHI * size
|
r = PHI * size
|
||||||
)
|
)
|
||||||
concat(
|
|
||||||
[tile(KITE, x, y, between_360(angle + 5 * 36), n_size)],
|
|
||||||
[
|
[
|
||||||
|
tile(KITE, x, y, between_360(angle + 5 * 36), n_size),
|
||||||
|
each [
|
||||||
for(i = 0, sign = 1; i < 2; i = i + 1, sign = -sign)
|
for(i = 0, sign = 1; i < 2; i = i + 1, sign = -sign)
|
||||||
let(a = between_360(angle - 4 * 36 * sign))
|
let(a = between_360(angle - 4 * 36 * sign))
|
||||||
tile(
|
tile(
|
||||||
@@ -80,7 +80,7 @@ function sub_dart(tile) =
|
|||||||
n_size
|
n_size
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
);
|
];
|
||||||
|
|
||||||
function subdivide(tiles) = [
|
function subdivide(tiles) = [
|
||||||
for(tile = tiles)
|
for(tile = tiles)
|
||||||
@@ -114,9 +114,9 @@ function tile_penrose2(n, triangles) =
|
|||||||
angle = tile_angle(tile) - 36,
|
angle = tile_angle(tile) - 36,
|
||||||
type = tile_type(tile),
|
type = tile_type(tile),
|
||||||
size = tile_size(tile),
|
size = tile_size(tile),
|
||||||
shape = concat(
|
shape = [
|
||||||
[[tile_x(tile), tile_y(tile)]],
|
[tile_x(tile), tile_y(tile)],
|
||||||
[
|
each [
|
||||||
for(i = [0:2])
|
for(i = [0:2])
|
||||||
let(
|
let(
|
||||||
r = dist[type][i] * size,
|
r = dist[type][i] * size,
|
||||||
@@ -124,7 +124,7 @@ function tile_penrose2(n, triangles) =
|
|||||||
)
|
)
|
||||||
[tile_x(tile) + r * cos(a), tile_y(tile) + r * sin(a)]
|
[tile_x(tile) + r * cos(a), tile_y(tile) + r * sin(a)]
|
||||||
]
|
]
|
||||||
)
|
]
|
||||||
)
|
)
|
||||||
each [
|
each [
|
||||||
[type, [shape[0], shape[1], shape[2]]],
|
[type, [shape[0], shape[1], shape[2]]],
|
||||||
|
@@ -25,7 +25,7 @@ function _sub_obtuse(a, b, c) =
|
|||||||
PHI = 1.618033988749895,
|
PHI = 1.618033988749895,
|
||||||
r = b + (c - b) / PHI
|
r = b + (c - b) / PHI
|
||||||
)
|
)
|
||||||
concat([["OBTUSE", r, c, a]], _sub_acute(b, a, r));
|
[["OBTUSE", r, c, a], each _sub_acute(b, a, r)];
|
||||||
|
|
||||||
function _penrose3(triangles, n, i = 0) =
|
function _penrose3(triangles, n, i = 0) =
|
||||||
i == n ? triangles :
|
i == n ? triangles :
|
||||||
|
@@ -59,13 +59,7 @@ module hexagons(radius, spacing, levels) {
|
|||||||
[[hex_datum[0][0], -hex_datum[0][1]], hex_datum[1]]
|
[[hex_datum[0][0], -hex_datum[0][1]], hex_datum[1]]
|
||||||
] : [];
|
] : [];
|
||||||
|
|
||||||
total_hex_data = concat(
|
total_hex_data = [[[0, 0], beginning_n], each upper_hex_data, each lower_hex_data];
|
||||||
[
|
|
||||||
[[0, 0], beginning_n] // first line
|
|
||||||
],
|
|
||||||
upper_hex_data,
|
|
||||||
lower_hex_data
|
|
||||||
);
|
|
||||||
|
|
||||||
pts_all_lines = [
|
pts_all_lines = [
|
||||||
for(hex_datum = total_hex_data)
|
for(hex_datum = total_hex_data)
|
||||||
|
@@ -29,11 +29,7 @@ module loft(sections, slices = 1) {
|
|||||||
p1 = sect[i],
|
p1 = sect[i],
|
||||||
p2 = sect[(i + 1) % leng]
|
p2 = sect[(i + 1) % leng]
|
||||||
)
|
)
|
||||||
concat(
|
[p1, each inter_pts(p1, p2, n), each _interpolate(sect, leng, n, i + 1)];
|
||||||
[p1],
|
|
||||||
inter_pts(p1, p2, n),
|
|
||||||
_interpolate(sect, leng, n, i + 1)
|
|
||||||
);
|
|
||||||
|
|
||||||
function interpolate(sect, n) =
|
function interpolate(sect, n) =
|
||||||
n <= 1 ? sect : _interpolate(sect, len(sect), n);
|
n <= 1 ? sect : _interpolate(sect, len(sect), n);
|
||||||
@@ -53,13 +49,7 @@ module loft(sections, slices = 1) {
|
|||||||
new_sect1 = interpolate(sect1, lcm_n / len(sect1));
|
new_sect1 = interpolate(sect1, lcm_n / len(sect1));
|
||||||
new_sect2 = interpolate(sect2, lcm_n / len(sect2));
|
new_sect2 = interpolate(sect2, lcm_n / len(sect2));
|
||||||
|
|
||||||
sweep(
|
sweep([new_sect1, each inter_sects(new_sect1, new_sect2, lcm_n, slices), new_sect2]);
|
||||||
concat(
|
|
||||||
[new_sect1],
|
|
||||||
inter_sects(new_sect1, new_sect2, lcm_n, slices),
|
|
||||||
[new_sect2]
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = [0:len(sections) - 2]) {
|
for(i = [0:len(sections) - 2]) {
|
||||||
|
@@ -51,6 +51,4 @@ function _mz_hamiltonian_travel(dot_pts, p, leng, i = 0) =
|
|||||||
dir_i = _mz_hamiltonian_dir(_mz_hamiltonian_corner_value(dot_pts, p.x, p.y)),
|
dir_i = _mz_hamiltonian_dir(_mz_hamiltonian_corner_value(dot_pts, p.x, p.y)),
|
||||||
nxt_p = p + _mz_hamiltonian_nxt_offset[dir_i]
|
nxt_p = p + _mz_hamiltonian_nxt_offset[dir_i]
|
||||||
)
|
)
|
||||||
concat(
|
[p, each _mz_hamiltonian_travel(dot_pts, nxt_p, leng, i + 1)];
|
||||||
[p], _mz_hamiltonian_travel(dot_pts, nxt_p, leng, i + 1)
|
|
||||||
);
|
|
||||||
|
@@ -32,7 +32,7 @@ function set_outwards(cell, outwards) = [
|
|||||||
function get_outwards(cell) = cell[5];
|
function get_outwards(cell) = cell[5];
|
||||||
|
|
||||||
function add_outward(cell, outward) = [
|
function add_outward(cell, outward) = [
|
||||||
cell[0], cell[1], cell[2], cell[3], cell[4], concat(get_outwards(cell), [outward]), cell[6], cell[7]
|
cell[0], cell[1], cell[2], cell[3], cell[4], [each get_outwards(cell), outward], cell[6], cell[7]
|
||||||
];
|
];
|
||||||
|
|
||||||
function columnLengOfRow(ri, cellWidth, previousColumnLeng, dividedRatio) =
|
function columnLengOfRow(ri, cellWidth, previousColumnLeng, dividedRatio) =
|
||||||
@@ -63,7 +63,7 @@ function _init_theta_maze(ri, maze, totalRows, dividedRatio, cellWidth) =
|
|||||||
cell(ri, ci, INWARD_CCW_WALL)
|
cell(ri, ci, INWARD_CCW_WALL)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
_init_theta_maze(ri + 1, concat(maze, [row]), totalRows, dividedRatio, cellWidth);
|
_init_theta_maze(ri + 1, [each maze, row], totalRows, dividedRatio, cellWidth);
|
||||||
|
|
||||||
function update_maze_row(row, cell) =
|
function update_maze_row(row, cell) =
|
||||||
let(leng = len(row))
|
let(leng = len(row))
|
||||||
|
@@ -26,7 +26,7 @@ function _nz_cell_border(cells, p) =
|
|||||||
let(
|
let(
|
||||||
dists = [
|
dists = [
|
||||||
for(i = [0:len(cells) - 1])
|
for(i = [0:len(cells) - 1])
|
||||||
concat(cells[i], [norm(cells[i] - p)])
|
[each cells[i], norm(cells[i] - p)]
|
||||||
],
|
],
|
||||||
idx = len(cells[0]),
|
idx = len(cells[0]),
|
||||||
sorted = sort(dists, by = "idx", idx = idx),
|
sorted = sort(dists, by = "idx", idx = idx),
|
||||||
|
@@ -89,7 +89,7 @@ module path_extrude(shape_pts, path_pts, triangles = "SOLID", twist = 0, scale =
|
|||||||
curr_matrix = rot_matrice[i],
|
curr_matrix = rot_matrice[i],
|
||||||
prev_matrix = matrice[len(matrice) - 1]
|
prev_matrix = matrice[len(matrice) - 1]
|
||||||
)
|
)
|
||||||
concat(matrice, [curr_matrix * prev_matrix]);
|
[each matrice, curr_matrix * prev_matrix];
|
||||||
|
|
||||||
cumu_rot_matrice = cumulated_rot_matrice(0);
|
cumu_rot_matrice = cumulated_rot_matrice(0);
|
||||||
|
|
||||||
@@ -137,11 +137,11 @@ module path_extrude(shape_pts, path_pts, triangles = "SOLID", twist = 0, scale =
|
|||||||
pth_pts[i + 1]
|
pth_pts[i + 1]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
) concat([fst_section], remain_sections);
|
) [fst_section, each remain_sections];
|
||||||
|
|
||||||
calculated_sections =
|
calculated_sections =
|
||||||
closed && pth_pts[0] == pth_pts[len_path_pts_minus_one] ?
|
closed && pth_pts[0] == pth_pts[len_path_pts_minus_one] ?
|
||||||
concat(sections, [sections[0]]) : // round-robin
|
[each sections, sections[0]] : // round-robin
|
||||||
sections;
|
sections;
|
||||||
|
|
||||||
sweep(
|
sweep(
|
||||||
@@ -186,8 +186,8 @@ module path_extrude(shape_pts, path_pts, triangles = "SOLID", twist = 0, scale =
|
|||||||
|
|
||||||
calculated_sections =
|
calculated_sections =
|
||||||
closed && pth_pts[0] == pth_pts[len_path_pts_minus_one] ?
|
closed && pth_pts[0] == pth_pts[len_path_pts_minus_one] ?
|
||||||
concat(path_extrude_inner, [path_extrude_inner[0]]) : // round-robin
|
[each path_extrude_inner, path_extrude_inner[0]] : // round-robin
|
||||||
concat([section(pth_pts[0], pth_pts[1], 0)], path_extrude_inner);
|
[section(pth_pts[0], pth_pts[1], 0), each path_extrude_inner];
|
||||||
|
|
||||||
sweep(
|
sweep(
|
||||||
calculated_sections,
|
calculated_sections,
|
||||||
|
@@ -5,8 +5,8 @@ function geom_star(outerRadius = 1, innerRadius = 0.381966, height = 0.5, n = 5
|
|||||||
half_thetaStep = thetaStep / 2,
|
half_thetaStep = thetaStep / 2,
|
||||||
half_height = height / 2,
|
half_height = height / 2,
|
||||||
leng_star = n * 2,
|
leng_star = n * 2,
|
||||||
points = concat(
|
points = [
|
||||||
[
|
each [
|
||||||
for(i = [0:n - 1])
|
for(i = [0:n - 1])
|
||||||
let(
|
let(
|
||||||
a = thetaStep * i + right,
|
a = thetaStep * i + right,
|
||||||
@@ -15,8 +15,9 @@ function geom_star(outerRadius = 1, innerRadius = 0.381966, height = 0.5, n = 5
|
|||||||
)
|
)
|
||||||
each [outerPoint, innerPoint]
|
each [outerPoint, innerPoint]
|
||||||
],
|
],
|
||||||
[[0, 0, half_height], [0, 0, -half_height]]
|
[0, 0, half_height],
|
||||||
),
|
[0, 0, -half_height]
|
||||||
|
],
|
||||||
faces = [
|
faces = [
|
||||||
for(i = [0:leng_star - 1])
|
for(i = [0:leng_star - 1])
|
||||||
each [[leng_star, (i + 1) % leng_star, i], [i, (i + 1) % leng_star, leng_star + 1]]
|
each [[leng_star, (i + 1) % leng_star, i], [i, (i + 1) % leng_star, leng_star + 1]]
|
||||||
|
@@ -31,24 +31,17 @@ module ring_extrude(shape_pts, radius, angle = 360, twist = 0, scale = 1.0, tria
|
|||||||
begin_r = leng / cos((m - 0.5) * a_step - angles[0]);
|
begin_r = leng / cos((m - 0.5) * a_step - angles[0]);
|
||||||
end_r = leng / cos((n + 0.5) * a_step - angles[1]);
|
end_r = leng / cos((n + 0.5) * a_step - angles[1]);
|
||||||
|
|
||||||
angs = concat(
|
angs = [[90, 0, angles[0]], each (m > n ? [] : [for(i = [m:n]) [90, 0, a_step * i]])];
|
||||||
[[90, 0, angles[0]]],
|
|
||||||
m > n ? [] : [for(i = [m:n]) [90, 0, a_step * i]]
|
pts = [__ra_to_xy(begin_r, angles[0]), each (m > n ? [] : [for(i = [m:n]) __ra_to_xy(radius, a_step * i)])];
|
||||||
);
|
|
||||||
pts = concat(
|
|
||||||
[__ra_to_xy(begin_r, angles[0])],
|
|
||||||
m > n ? [] : [for(i = [m:n]) __ra_to_xy(radius, a_step * i)]
|
|
||||||
);
|
|
||||||
|
|
||||||
is_angle_frag_end = angs[len(angs) - 1][2] == angles[1];
|
is_angle_frag_end = angs[len(angs) - 1][2] == angles[1];
|
||||||
|
|
||||||
all_angles = is_angle_frag_end ?
|
all_angles = is_angle_frag_end ?
|
||||||
angs :
|
angs : [each angs, [90, 0, angles[1]]];
|
||||||
concat(angs, [[90, 0, angles[1]]]);
|
|
||||||
|
|
||||||
all_points = is_angle_frag_end ?
|
all_points = is_angle_frag_end ?
|
||||||
pts :
|
pts : [each pts, __ra_to_xy(end_r, angles[1])];
|
||||||
concat(pts, [__ra_to_xy(end_r, angles[1])]);
|
|
||||||
|
|
||||||
sections = cross_sections(shape_pts, all_points, all_angles, twist, scale);
|
sections = cross_sections(shape_pts, all_points, all_angles, twist, scale);
|
||||||
|
|
||||||
|
@@ -13,11 +13,7 @@ use <__comm__/__half_trapezium.scad>;
|
|||||||
module rounded_cylinder(radius, h, round_r, convexity = 2, center = false) {
|
module rounded_cylinder(radius, h, round_r, convexity = 2, center = false) {
|
||||||
r_corners = __half_trapezium(radius, h, round_r);
|
r_corners = __half_trapezium(radius, h, round_r);
|
||||||
|
|
||||||
shape_pts = concat(
|
shape_pts = [[0, -h/2], each r_corners, [0, h/2]];
|
||||||
[[0, -h/2]],
|
|
||||||
r_corners,
|
|
||||||
[[0, h/2]]
|
|
||||||
);
|
|
||||||
|
|
||||||
center_pt = center ? [0, 0, 0] : [0, 0, h/2];
|
center_pt = center ? [0, 0, 0] : [0, 0, h/2];
|
||||||
|
|
||||||
|
@@ -23,21 +23,19 @@ function shape_arc(radius, angle, width, width_mode = "LINE_CROSS") =
|
|||||||
n = floor(angles[1] / a_step),
|
n = floor(angles[1] / a_step),
|
||||||
r_outer = radius + w_offset[0],
|
r_outer = radius + w_offset[0],
|
||||||
r_inner = radius + w_offset[1],
|
r_inner = radius + w_offset[1],
|
||||||
points = concat(
|
points = [
|
||||||
// outer arc path
|
// outer arc path
|
||||||
[__ra_to_xy(__edge_r_begin(r_outer, angles[0], a_step, m), angles[0])],
|
__ra_to_xy(__edge_r_begin(r_outer, angles[0], a_step, m), angles[0]),
|
||||||
m > n ? [] : [
|
if(m <= n) each [for(i = m; i <= n; i = i + 1) __ra_to_xy(r_outer, a_step * i)],
|
||||||
for(i = m; i <= n; i = i + 1) __ra_to_xy(r_outer, a_step * i)
|
if(angles[1] != a_step * n) __ra_to_xy(__edge_r_end(r_outer, angles[1], a_step, n), angles[1]),
|
||||||
],
|
|
||||||
angles[1] == a_step * n ? [] : [__ra_to_xy(__edge_r_end(r_outer, angles[1], a_step, n), angles[1])],
|
|
||||||
// inner arc path
|
// inner arc path
|
||||||
angles[1] == a_step * n ? [] : [__ra_to_xy(__edge_r_end(r_inner, angles[1], a_step, n), angles[1])],
|
if(angles[1] != a_step * n) __ra_to_xy(__edge_r_end(r_inner, angles[1], a_step, n), angles[1]),
|
||||||
m > n ? [] : [
|
if(m <= n) each [
|
||||||
for(i = m; i <= n; i = i + 1)
|
for(i = m; i <= n; i = i + 1)
|
||||||
let(idx = (n + (m - i)))
|
let(idx = (n + (m - i)))
|
||||||
__ra_to_xy(r_inner, a_step * idx)
|
__ra_to_xy(r_inner, a_step * idx)
|
||||||
|
|
||||||
],
|
],
|
||||||
[__ra_to_xy(__edge_r_begin(r_inner, angles[0], a_step, m), angles[0])]
|
__ra_to_xy(__edge_r_begin(r_inner, angles[0], a_step, m), angles[0])
|
||||||
)
|
]
|
||||||
) points;
|
) points;
|
@@ -20,13 +20,14 @@ function shape_pie(radius, angle) =
|
|||||||
n = floor(angles[1] / a_step),
|
n = floor(angles[1] / a_step),
|
||||||
edge_r_begin = leng / cos((m - 0.5) * a_step - angles[0]),
|
edge_r_begin = leng / cos((m - 0.5) * a_step - angles[0]),
|
||||||
edge_r_end = leng / cos((n + 0.5) * a_step - angles[1]),
|
edge_r_end = leng / cos((n + 0.5) * a_step - angles[1]),
|
||||||
shape_pts = concat(
|
shape_pts = [
|
||||||
[[0, 0], __ra_to_xy(edge_r_begin, angles[0])],
|
[0, 0],
|
||||||
m > n ? [] : [
|
__ra_to_xy(edge_r_begin, angles[0]),
|
||||||
|
if(m <= n) each [
|
||||||
for(i = m; i <= n; i = i + 1)
|
for(i = m; i <= n; i = i + 1)
|
||||||
let(a = a_step * i)
|
let(a = a_step * i)
|
||||||
__ra_to_xy(radius, a)
|
__ra_to_xy(radius, a)
|
||||||
],
|
],
|
||||||
angles[1] == a_step * n ? [] : [__ra_to_xy(edge_r_end, angles[1])]
|
if(angles[1] != a_step * n) __ra_to_xy(edge_r_end, angles[1])
|
||||||
)
|
]
|
||||||
) shape_pts;
|
) shape_pts;
|
@@ -36,7 +36,7 @@ module sf_thickenT(points, thickness, triangles = undef, direction = "BOTH", con
|
|||||||
tri = sort(triangles[i], by = ascending),
|
tri = sort(triangles[i], by = ascending),
|
||||||
n_cnt_tris = [
|
n_cnt_tris = [
|
||||||
for(k = [0:leng_pts - 1])
|
for(k = [0:leng_pts - 1])
|
||||||
find_index(tri, function(e) e == k) != -1 ? concat(cnt_tris[k], [triangles[i]]) : cnt_tris[k]
|
find_index(tri, function(e) e == k) != -1 ? [each cnt_tris[k], triangles[i]] : cnt_tris[k]
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
_connected_tris(triangles, leng, leng_pts, n_cnt_tris, i + 1);
|
_connected_tris(triangles, leng, leng_pts, n_cnt_tris, i + 1);
|
||||||
|
@@ -96,7 +96,7 @@ module sweep(sections, triangles = "SOLID") {
|
|||||||
i + leng_pts_sect * (leng_sects - 1)
|
i + leng_pts_sect * (leng_sects - 1)
|
||||||
];
|
];
|
||||||
|
|
||||||
f_idxes = concat([first_idxes], side_indexes(sects), [last_idxes]);
|
f_idxes = [first_idxes, each side_indexes(sects), last_idxes];
|
||||||
|
|
||||||
polyhedron(
|
polyhedron(
|
||||||
v_pts,
|
v_pts,
|
||||||
|
@@ -156,7 +156,7 @@ function updateNbrs(d, delaunayTri, neighbors, _indices_hash) =
|
|||||||
|
|
||||||
function delaunayAddCoords(d, p) =
|
function delaunayAddCoords(d, p) =
|
||||||
[
|
[
|
||||||
concat(delaunay_coords(d), [p]),
|
[each delaunay_coords(d), p],
|
||||||
delaunay_triangles(d),
|
delaunay_triangles(d),
|
||||||
delaunay_circles(d)
|
delaunay_circles(d)
|
||||||
];
|
];
|
||||||
@@ -206,10 +206,10 @@ function _delaunayBoundaries(d, badTriangles, boundaries, t, vi, _indices_hash)
|
|||||||
)
|
)
|
||||||
_delaunayBoundaries(d, badTriangles, boundaries, nt, nvi, _indices_hash) :
|
_delaunayBoundaries(d, badTriangles, boundaries, nt, nvi, _indices_hash) :
|
||||||
let(
|
let(
|
||||||
nboundaries = concat(boundaries, [[
|
nboundaries = [each boundaries, [
|
||||||
[t[(vi + 1) % 3], t[vi > 0 ? vi - 1 : (vi + 2)]], // edge
|
[t[(vi + 1) % 3], t[vi > 0 ? vi - 1 : (vi + 2)]], // edge
|
||||||
opTri // delaunayTri
|
opTri // delaunayTri
|
||||||
]]),
|
]],
|
||||||
nvi = (vi + 1) % 3,
|
nvi = (vi + 1) % 3,
|
||||||
v1 = nboundaries[0][0][0],
|
v1 = nboundaries[0][0][0],
|
||||||
v2 = nboundaries[len(nboundaries) - 1][0][1]
|
v2 = nboundaries[len(nboundaries) - 1][0][1]
|
||||||
|
@@ -68,7 +68,7 @@ function _triangulate_snip(shape_pts, collector, indices, u, v, w, num_of_vertic
|
|||||||
)
|
)
|
||||||
_triangulate_real_triangulate(
|
_triangulate_real_triangulate(
|
||||||
shape_pts,
|
shape_pts,
|
||||||
concat(collector, [[a, b, c]]),
|
[each collector, [a, b, c]],
|
||||||
_triangulate_remove_v(indices, v, num_of_vertices),
|
_triangulate_remove_v(indices, v, num_of_vertices),
|
||||||
v,
|
v,
|
||||||
new_nv,
|
new_nv,
|
||||||
|
@@ -6,4 +6,4 @@ function _footprints2(cmds, t, leng, i = 0) =
|
|||||||
nxt = turtle2d(cmds[i][0], t, cmds[i][1]),
|
nxt = turtle2d(cmds[i][0], t, cmds[i][1]),
|
||||||
pts = _footprints2(cmds, nxt, leng, i + 1)
|
pts = _footprints2(cmds, nxt, leng, i + 1)
|
||||||
)
|
)
|
||||||
cmds[i][0] != "forward" ? pts : concat([turtle2d("pt", nxt)], pts);
|
cmds[i][0] != "forward" ? pts : [turtle2d("pt", nxt), each pts];
|
@@ -6,4 +6,4 @@ function _footprints3(cmds, t, leng, i = 0) =
|
|||||||
nxt = turtle3d(cmds[i][0], t, cmds[i][1]),
|
nxt = turtle3d(cmds[i][0], t, cmds[i][1]),
|
||||||
pts = _footprints3(cmds, nxt, leng, i + 1)
|
pts = _footprints3(cmds, nxt, leng, i + 1)
|
||||||
)
|
)
|
||||||
cmds[i][0] != "forward" && cmds[i][0] != "yu_move" && cmds[i][0] != "zu_move" ? pts : concat([turtle3d("pt", nxt)], pts);
|
cmds[i][0] != "forward" && cmds[i][0] != "yu_move" && cmds[i][0] != "zu_move" ? pts : [turtle3d("pt", nxt), each pts];
|
||||||
|
@@ -8,7 +8,7 @@ function _lsystem2_derive(axiom, rules, n, rule_prs) =
|
|||||||
_derive_p(axiom, rules, rule_prs, n);
|
_derive_p(axiom, rules, rule_prs, n);
|
||||||
|
|
||||||
function _next_stack(t, code, stack) =
|
function _next_stack(t, code, stack) =
|
||||||
code == "[" ? concat([t], stack) :
|
code == "[" ? [t, each stack] :
|
||||||
let(leng = len(stack))
|
let(leng = len(stack))
|
||||||
code == "]" ?
|
code == "]" ?
|
||||||
(leng > 1 ? [for(i = [1:leng - 1]) stack[i]] : []) :
|
(leng > 1 ? [for(i = [1:leng - 1]) stack[i]] : []) :
|
||||||
|
@@ -8,7 +8,7 @@ function _lsystem3_derive(axiom, rules, n, rule_prs) =
|
|||||||
_derive_p(axiom, rules, rule_prs, n);
|
_derive_p(axiom, rules, rule_prs, n);
|
||||||
|
|
||||||
function _next_stack(t, code, stack) =
|
function _next_stack(t, code, stack) =
|
||||||
code == "[" ? concat([t], stack) :
|
code == "[" ? [t, each stack] :
|
||||||
let(leng = len(stack))
|
let(leng = len(stack))
|
||||||
code == "]" ?
|
code == "]" ?
|
||||||
(leng > 1 ? [for(i = [1:leng - 1]) stack[i]] : []) :
|
(leng > 1 ? [for(i = [1:leng - 1]) stack[i]] : []) :
|
||||||
|
@@ -16,4 +16,4 @@ function footprints2(cmds, start = [0, 0]) =
|
|||||||
t = turtle2d("create", start.x, start.y, 0),
|
t = turtle2d("create", start.x, start.y, 0),
|
||||||
leng = len(cmds)
|
leng = len(cmds)
|
||||||
)
|
)
|
||||||
concat([turtle2d("pt", t)], _footprints2(cmds, t, leng));
|
[turtle2d("pt", t), each _footprints2(cmds, t, leng)];
|
@@ -16,4 +16,4 @@ function footprints3(cmds, start = [0, 0, 0]) =
|
|||||||
t = turtle3d("create", start, [[1, 0, 0], [0, 1, 0], [0, 0, 1]]),
|
t = turtle3d("create", start, [[1, 0, 0], [0, 1, 0], [0, 0, 1]]),
|
||||||
leng = len(cmds)
|
leng = len(cmds)
|
||||||
)
|
)
|
||||||
concat([turtle3d("pt", t)], _footprints3(cmds, t, leng));
|
[turtle3d("pt", t), each _footprints3(cmds, t, leng)];
|
@@ -15,4 +15,4 @@ function _dedup_add(buckets, i_elem, eq, hash, bucket_numbers) =
|
|||||||
|
|
||||||
function _add(buckets, bucket, i_elem, b_idx) =
|
function _add(buckets, bucket, i_elem, b_idx) =
|
||||||
let(leng = len(buckets))
|
let(leng = len(buckets))
|
||||||
[for(i = 0; i < leng; i = i + 1) i == b_idx ? concat(bucket, [i_elem]) : buckets[i]];
|
[for(i = 0; i < leng; i = i + 1) i == b_idx ? [each bucket, i_elem] : buckets[i]];
|
@@ -3,7 +3,7 @@ use <../../__comm__/__fast_fibonacci.scad>;
|
|||||||
function _fibonacci_sequence(seq, n, i = 2) =
|
function _fibonacci_sequence(seq, n, i = 2) =
|
||||||
i > n ? seq :
|
i > n ? seq :
|
||||||
_fibonacci_sequence(
|
_fibonacci_sequence(
|
||||||
concat(seq, [seq[i - 1] + seq[i - 2]]),
|
[each seq, seq[i - 1] + seq[i - 2]],
|
||||||
n,
|
n,
|
||||||
i + 1
|
i + 1
|
||||||
);
|
);
|
||||||
|
@@ -8,7 +8,7 @@ function _vt_sort(lt) =
|
|||||||
before = [for(j = 1; j < leng; j = j + 1) if(lessThan(lt[j], pivot)) lt[j]],
|
before = [for(j = 1; j < leng; j = j + 1) if(lessThan(lt[j], pivot)) lt[j]],
|
||||||
after = [for(j = 1; j < leng; j = j + 1) if(greaterThan(lt[j], pivot) || lt[j] == pivot) lt[j]]
|
after = [for(j = 1; j < leng; j = j + 1) if(greaterThan(lt[j], pivot) || lt[j] == pivot) lt[j]]
|
||||||
)
|
)
|
||||||
concat(_vt_sort(before), [pivot], _vt_sort(after));
|
[each _vt_sort(before), pivot, each _vt_sort(after)];
|
||||||
|
|
||||||
function _sort_by_idx(lt, i) =
|
function _sort_by_idx(lt, i) =
|
||||||
let(leng = len(lt))
|
let(leng = len(lt))
|
||||||
@@ -18,7 +18,7 @@ function _sort_by_idx(lt, i) =
|
|||||||
before = [for(j = 1; j < leng; j = j + 1) if(lt[j][i] < pivot[i]) lt[j]],
|
before = [for(j = 1; j < leng; j = j + 1) if(lt[j][i] < pivot[i]) lt[j]],
|
||||||
after = [for(j = 1; j < leng; j = j + 1) if(lt[j][i] >= pivot[i]) lt[j]]
|
after = [for(j = 1; j < leng; j = j + 1) if(lt[j][i] >= pivot[i]) lt[j]]
|
||||||
)
|
)
|
||||||
concat(_sort_by_idx(before, i), [pivot], _sort_by_idx(after, i));
|
[each _sort_by_idx(before, i), pivot, each _sort_by_idx(after, i)];
|
||||||
|
|
||||||
function _sort_by(lt, by, idx) =
|
function _sort_by(lt, by, idx) =
|
||||||
let(
|
let(
|
||||||
@@ -35,4 +35,4 @@ function _sort_by_cmp(lt, cmp) =
|
|||||||
before = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) < 0) lt[j]],
|
before = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) < 0) lt[j]],
|
||||||
after = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) >= 0) lt[j]]
|
after = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) >= 0) lt[j]]
|
||||||
)
|
)
|
||||||
concat(_sort_by_cmp(before, cmp), [pivot], _sort_by_cmp(after, cmp));
|
[each _sort_by_cmp(before, cmp), pivot, each _sort_by_cmp(after, cmp)];
|
||||||
|
@@ -2,13 +2,7 @@ use <../sub_str.scad>;
|
|||||||
|
|
||||||
function _split_t_by(idxs, t) =
|
function _split_t_by(idxs, t) =
|
||||||
let(leng = len(idxs))
|
let(leng = len(idxs))
|
||||||
concat(
|
[sub_str(t, 0, idxs[0]), each [for(i = 0; i < leng; i = i + 1) sub_str(t, idxs[i] + 1, idxs[i + 1])]];
|
||||||
[sub_str(t, 0, idxs[0])],
|
|
||||||
[
|
|
||||||
for(i = 0; i < leng; i = i + 1)
|
|
||||||
sub_str(t, idxs[i] + 1, idxs[i + 1])
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
function _split_str_impl(t, delimiter) =
|
function _split_str_impl(t, delimiter) =
|
||||||
len(search(delimiter, t)) == 0 ?
|
len(search(delimiter, t)) == 0 ?
|
||||||
|
@@ -2,6 +2,9 @@ _identity = function(elems) elems;
|
|||||||
|
|
||||||
function _zipAll_sub(lts, list_to, elem_to, combine, i = 0) =
|
function _zipAll_sub(lts, list_to, elem_to, combine, i = 0) =
|
||||||
i > elem_to ? [] :
|
i > elem_to ? [] :
|
||||||
concat([combine([for(j = [0:list_to]) lts[j][i]])], _zipAll_sub(lts, list_to, elem_to, combine, i + 1));
|
concat(
|
||||||
|
[combine([for(j = [0:list_to]) lts[j][i]])],
|
||||||
|
_zipAll_sub(lts, list_to, elem_to, combine, i + 1)
|
||||||
|
);
|
||||||
|
|
||||||
function _zipAll(lts, combine = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, combine);
|
function _zipAll(lts, combine = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, combine);
|
@@ -18,4 +18,4 @@ function _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) =
|
|||||||
[for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? n_bucket : buckets[i]];
|
[for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? n_bucket : buckets[i]];
|
||||||
|
|
||||||
function _put(buckets, b_numbers, bucket, key, value, b_idx) =
|
function _put(buckets, b_numbers, bucket, key, value, b_idx) =
|
||||||
[for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? concat(bucket, [[key, value]]) : buckets[i]];
|
[for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? [each bucket, [key, value]] : buckets[i]];
|
@@ -8,8 +8,4 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
function hashmap_keys(map) = [
|
function hashmap_keys(map) = [for(bucket = map, kv = bucket) kv[0]];
|
||||||
for(bucket = map)
|
|
||||||
for(kv = bucket)
|
|
||||||
kv[0]
|
|
||||||
];
|
|
@@ -8,8 +8,4 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
function hashmap_values(map) = [
|
function hashmap_values(map) = [for(bucket = map, kv = bucket) kv[1]];
|
||||||
for(bucket = map)
|
|
||||||
for(kv = bucket)
|
|
||||||
kv[1]
|
|
||||||
];
|
|
@@ -8,4 +8,4 @@ function _hashset_add(buckets, b_numbers, elem, eq, hash) =
|
|||||||
some(bucket, function(e) eq(e, elem)) ? buckets : _add(buckets, b_numbers, bucket, elem, idx);
|
some(bucket, function(e) eq(e, elem)) ? buckets : _add(buckets, b_numbers, bucket, elem, idx);
|
||||||
|
|
||||||
function _add(buckets, b_numbers, bucket, elem, idx) =
|
function _add(buckets, b_numbers, bucket, elem, idx) =
|
||||||
[for(i = 0; i < b_numbers; i = i + 1) i == idx ? concat(bucket, [elem]) : buckets[i]];
|
[for(i = 0; i < b_numbers; i = i + 1) i == idx ? [each bucket, elem] : buckets[i]];
|
@@ -15,10 +15,10 @@ function swap(lt, i, j) =
|
|||||||
a = min([i, j]),
|
a = min([i, j]),
|
||||||
b = max([i, j])
|
b = max([i, j])
|
||||||
)
|
)
|
||||||
concat(
|
[
|
||||||
a == 0 ? [] : [for(idx = [0:a - 1]) lt[idx]],
|
each (a == 0 ? [] : [for(idx = [0:a - 1]) lt[idx]]),
|
||||||
[lt[b]],
|
lt[b],
|
||||||
b - a == 1? [] : [for(idx = [a + 1:b - 1]) lt[idx]],
|
each (b - a == 1 ? [] : [for(idx = [a + 1:b - 1]) lt[idx]]),
|
||||||
[lt[a]],
|
lt[a],
|
||||||
b == leng - 1 ? [] : [for(idx = [b + 1:leng - 1]) lt[idx]]
|
each (b == leng - 1 ? [] : [for(idx = [b + 1:leng - 1]) lt[idx]])
|
||||||
);
|
];
|
@@ -29,16 +29,13 @@ module vrn2_space(size, grid_w, seed, spacing = 1, r = 0, delta = 0, chamfer = f
|
|||||||
|
|
||||||
// 21-nearest-neighbor
|
// 21-nearest-neighbor
|
||||||
function _neighbors(fcord, seed, grid_w, gw, gh) =
|
function _neighbors(fcord, seed, grid_w, gw, gh) =
|
||||||
|
let(range = [-1:1])
|
||||||
concat(
|
concat(
|
||||||
[
|
[for(y = range, x = range) cell_pt(fcord, seed, x, y, gw, gh)],
|
||||||
for(y = [-1:1])
|
[for(x = range) cell_pt(fcord, seed, x, -2, gw, gh)],
|
||||||
for(x = [-1:1])
|
[for(x = range) cell_pt(fcord, seed, x, 2, gw, gh)],
|
||||||
cell_pt(fcord, seed, x, y, gw, gh)
|
[for(y = range) cell_pt(fcord, seed, -2, y, gw, gh)],
|
||||||
],
|
[for(y = range) cell_pt(fcord, seed, 2, y, gw, gh)]
|
||||||
[for(x = [-1:1]) cell_pt(fcord, seed, x, -2, gw, gh)],
|
|
||||||
[for(x = [-1:1]) cell_pt(fcord, seed, x, 2, gw, gh)],
|
|
||||||
[for(y = [-1:1]) cell_pt(fcord, seed, -2, y, gw, gh)],
|
|
||||||
[for(y = [-1:1]) cell_pt(fcord, seed, 2, y, gw, gh)]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
region_size = grid_w * 3;
|
region_size = grid_w * 3;
|
||||||
|
@@ -8,7 +8,7 @@ function _vx_bezier_pt3(p1, p2, p3, p4, pts) =
|
|||||||
c = (b1 + b2) * 0.5,
|
c = (b1 + b2) * 0.5,
|
||||||
p = [round(c[0]), round(c[1]), round(c[2])]
|
p = [round(c[0]), round(c[1]), round(c[2])]
|
||||||
)
|
)
|
||||||
_vx_bezier3(c, b2, a3, p4, _vx_bezier3(p1, a1, b1, c, concat(pts, [p])));
|
_vx_bezier3(c, b2, a3, p4, _vx_bezier3(p1, a1, b1, c, [each pts, p]));
|
||||||
|
|
||||||
function _vx_bezier3(p1, p2, p3, p4, pts) =
|
function _vx_bezier3(p1, p2, p3, p4, pts) =
|
||||||
(abs(p1[0] - p4[0]) < 0.5 && abs(p1[1] - p4[1]) < 0.5 && abs(p1[2] - p4[2]) < 0.5) ?
|
(abs(p1[0] - p4[0]) < 0.5 && abs(p1[1] - p4[1]) < 0.5 && abs(p1[2] - p4[2]) < 0.5) ?
|
||||||
@@ -25,7 +25,7 @@ function _vx_bezier_pt2(p1, p2, p3, p4, pts) =
|
|||||||
c = (b1 + b2) * 0.5,
|
c = (b1 + b2) * 0.5,
|
||||||
p = [round(c[0]), round(c[1])]
|
p = [round(c[0]), round(c[1])]
|
||||||
)
|
)
|
||||||
_vx_bezier2(c, b2, a3, p4, _vx_bezier2(p1, a1, b1, c, concat(pts, [p])));
|
_vx_bezier2(c, b2, a3, p4, _vx_bezier2(p1, a1, b1, c, [each pts, p]));
|
||||||
|
|
||||||
function _vx_bezier2(p1, p2, p3, p4, pts) =
|
function _vx_bezier2(p1, p2, p3, p4, pts) =
|
||||||
(abs(p1[0] - p4[0]) < 0.5 && abs(p1[1] - p4[1]) < 0.5) ?
|
(abs(p1[0] - p4[0]) < 0.5 && abs(p1[1] - p4[1]) < 0.5) ?
|
||||||
|
@@ -39,10 +39,7 @@ function _vx_circle_impl(radius, filled) =
|
|||||||
)
|
)
|
||||||
concat(
|
concat(
|
||||||
filled ?
|
filled ?
|
||||||
concat(
|
[[0, radius], [0, -radius], each [for(xi = -radius; xi <= radius; xi = xi + 1) [xi, 0]]]
|
||||||
[[0, radius], [0, -radius]],
|
|
||||||
[for(xi = -radius; xi <= radius; xi = xi + 1) [xi, 0]]
|
|
||||||
)
|
|
||||||
:
|
:
|
||||||
[
|
[
|
||||||
[0, -radius],
|
[0, -radius],
|
||||||
|
@@ -29,7 +29,4 @@ function _vx_contour_travel(pts, p, fst) =
|
|||||||
dir_i = _vx_contour_dir(_vx_contour_corner_value(pts, p[0], p[1])),
|
dir_i = _vx_contour_dir(_vx_contour_corner_value(pts, p[0], p[1])),
|
||||||
nxt_p = p + _vx_contour_nxt_offset[dir_i]
|
nxt_p = p + _vx_contour_nxt_offset[dir_i]
|
||||||
)
|
)
|
||||||
nxt_p == fst ? [p] :
|
nxt_p == fst ? [p] : [p, each _vx_contour_travel(pts, nxt_p, fst)];
|
||||||
concat(
|
|
||||||
[p], _vx_contour_travel(pts, nxt_p, fst)
|
|
||||||
);
|
|
||||||
|
@@ -26,9 +26,9 @@ function _vx_line_xdominant(start, end, a, s) =
|
|||||||
zd = az - shrx,
|
zd = az - shrx,
|
||||||
endx = end[0]
|
endx = end[0]
|
||||||
)
|
)
|
||||||
concat(
|
[
|
||||||
[start],
|
start,
|
||||||
_vx_line_xdominant_sub(
|
each _vx_line_xdominant_sub(
|
||||||
x + sx,
|
x + sx,
|
||||||
_vx_line_xdominant_y(y, yd, sy),
|
_vx_line_xdominant_y(y, yd, sy),
|
||||||
_vx_line_xdominant_z(z, zd, sz),
|
_vx_line_xdominant_z(z, zd, sz),
|
||||||
@@ -38,7 +38,7 @@ function _vx_line_xdominant(start, end, a, s) =
|
|||||||
_vx_line_xdominant_yd(yd, ax, ay),
|
_vx_line_xdominant_yd(yd, ax, ay),
|
||||||
_vx_line_xdominant_zd(zd, ax, az)
|
_vx_line_xdominant_zd(zd, ax, az)
|
||||||
)
|
)
|
||||||
);
|
];
|
||||||
|
|
||||||
function _vx_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) =
|
function _vx_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) =
|
||||||
let(
|
let(
|
||||||
@@ -49,9 +49,9 @@ function _vx_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) =
|
|||||||
sy = s[1],
|
sy = s[1],
|
||||||
sz = s[2]
|
sz = s[2]
|
||||||
)
|
)
|
||||||
x == endx ? [] :
|
x == endx ? [] : [
|
||||||
concat([[x, y, z]],
|
[x, y, z],
|
||||||
_vx_line_xdominant_sub(
|
each _vx_line_xdominant_sub(
|
||||||
x + sx,
|
x + sx,
|
||||||
_vx_line_xdominant_y(y, yd, sy),
|
_vx_line_xdominant_y(y, yd, sy),
|
||||||
_vx_line_xdominant_z(z, zd, sz),
|
_vx_line_xdominant_z(z, zd, sz),
|
||||||
@@ -61,7 +61,7 @@ function _vx_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) =
|
|||||||
_vx_line_xdominant_yd(yd, ax, ay),
|
_vx_line_xdominant_yd(yd, ax, ay),
|
||||||
_vx_line_xdominant_zd(zd, ax, az)
|
_vx_line_xdominant_zd(zd, ax, az)
|
||||||
)
|
)
|
||||||
);
|
];
|
||||||
|
|
||||||
// y-dominant
|
// y-dominant
|
||||||
function _vx_line_ydominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
|
function _vx_line_ydominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
|
||||||
@@ -85,9 +85,9 @@ function _vx_line_ydominant(start, end, a, s) =
|
|||||||
zd = az - shry,
|
zd = az - shry,
|
||||||
endy = end[1]
|
endy = end[1]
|
||||||
)
|
)
|
||||||
concat(
|
[
|
||||||
[start],
|
start,
|
||||||
_vx_line_ydominant_sub(
|
each _vx_line_ydominant_sub(
|
||||||
_vx_line_ydominant_x(x, xd, sx),
|
_vx_line_ydominant_x(x, xd, sx),
|
||||||
y + sy,
|
y + sy,
|
||||||
_vx_line_ydominant_z(z, zd, sz),
|
_vx_line_ydominant_z(z, zd, sz),
|
||||||
@@ -97,7 +97,7 @@ function _vx_line_ydominant(start, end, a, s) =
|
|||||||
_vx_line_ydominant_xd(xd, ax, ay),
|
_vx_line_ydominant_xd(xd, ax, ay),
|
||||||
_vx_line_ydominant_zd(zd, ay, az)
|
_vx_line_ydominant_zd(zd, ay, az)
|
||||||
)
|
)
|
||||||
);
|
];
|
||||||
|
|
||||||
function _vx_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) =
|
function _vx_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) =
|
||||||
let(
|
let(
|
||||||
@@ -108,9 +108,9 @@ function _vx_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) =
|
|||||||
sy = s[1],
|
sy = s[1],
|
||||||
sz = s[2]
|
sz = s[2]
|
||||||
)
|
)
|
||||||
y == endy ? [] :
|
y == endy ? [] : [
|
||||||
concat([[x, y, z]],
|
[x, y, z],
|
||||||
_vx_line_ydominant_sub(
|
each _vx_line_ydominant_sub(
|
||||||
_vx_line_ydominant_x(x, xd, sx),
|
_vx_line_ydominant_x(x, xd, sx),
|
||||||
y + sy,
|
y + sy,
|
||||||
_vx_line_ydominant_z(z, zd, sz),
|
_vx_line_ydominant_z(z, zd, sz),
|
||||||
@@ -120,7 +120,7 @@ function _vx_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) =
|
|||||||
_vx_line_ydominant_xd(xd, ax, ay),
|
_vx_line_ydominant_xd(xd, ax, ay),
|
||||||
_vx_line_ydominant_zd(zd, ay, az)
|
_vx_line_ydominant_zd(zd, ay, az)
|
||||||
)
|
)
|
||||||
);
|
];
|
||||||
|
|
||||||
// z-dominant
|
// z-dominant
|
||||||
function _vx_line_zdominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
|
function _vx_line_zdominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
|
||||||
@@ -145,9 +145,9 @@ function _vx_line_zdominant(start, end, a, s) =
|
|||||||
yd = ay - shrz,
|
yd = ay - shrz,
|
||||||
endz = end[2]
|
endz = end[2]
|
||||||
)
|
)
|
||||||
concat(
|
[
|
||||||
[start],
|
start,
|
||||||
_vx_line_zdominant_sub(
|
each _vx_line_zdominant_sub(
|
||||||
_vx_line_zdominant_x(x, xd, sx),
|
_vx_line_zdominant_x(x, xd, sx),
|
||||||
_vx_line_zdominant_y(y, yd, sy),
|
_vx_line_zdominant_y(y, yd, sy),
|
||||||
z + sz,
|
z + sz,
|
||||||
@@ -157,7 +157,7 @@ function _vx_line_zdominant(start, end, a, s) =
|
|||||||
_vx_line_zdominant_xd(xd, ax, az),
|
_vx_line_zdominant_xd(xd, ax, az),
|
||||||
_vx_line_zdominant_yd(yd, ay, az)
|
_vx_line_zdominant_yd(yd, ay, az)
|
||||||
)
|
)
|
||||||
);
|
];
|
||||||
|
|
||||||
function _vx_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) =
|
function _vx_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) =
|
||||||
let(
|
let(
|
||||||
@@ -168,9 +168,9 @@ function _vx_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) =
|
|||||||
sy = s[1],
|
sy = s[1],
|
||||||
sz = s[2]
|
sz = s[2]
|
||||||
)
|
)
|
||||||
z == endz ? [] :
|
z == endz ? [] : [
|
||||||
concat([[x, y, z]],
|
[x, y, z],
|
||||||
_vx_line_zdominant_sub(
|
each _vx_line_zdominant_sub(
|
||||||
_vx_line_zdominant_x(x, xd, sx),
|
_vx_line_zdominant_x(x, xd, sx),
|
||||||
_vx_line_zdominant_y(y, yd, sy),
|
_vx_line_zdominant_y(y, yd, sy),
|
||||||
z + sz,
|
z + sz,
|
||||||
@@ -180,7 +180,7 @@ function _vx_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) =
|
|||||||
_vx_line_zdominant_xd(xd, ax, az),
|
_vx_line_zdominant_xd(xd, ax, az),
|
||||||
_vx_line_zdominant_yd(yd, ay, az)
|
_vx_line_zdominant_yd(yd, ay, az)
|
||||||
)
|
)
|
||||||
);
|
];
|
||||||
|
|
||||||
function _vx_line_impl(p1, p2) =
|
function _vx_line_impl(p1, p2) =
|
||||||
let(
|
let(
|
||||||
|
@@ -14,15 +14,15 @@ use <../util/dedup.scad>;
|
|||||||
function vx_curve(points, tightness = 0) =
|
function vx_curve(points, tightness = 0) =
|
||||||
let(
|
let(
|
||||||
leng = len(points),
|
leng = len(points),
|
||||||
pts = concat(
|
pts = [
|
||||||
[
|
each [
|
||||||
for(i = [0:leng - 4])
|
for(i = [0:leng - 4])
|
||||||
let(
|
let(
|
||||||
pts = _vx_catmull_rom_spline_4pts([for(j = [i:i + 3]) points[j]], tightness)
|
pts = _vx_catmull_rom_spline_4pts([for(j = [i:i + 3]) points[j]], tightness)
|
||||||
)
|
)
|
||||||
for(i = [0:len(pts) - 2]) pts[i]
|
for(i = [0:len(pts) - 2]) pts[i]
|
||||||
],
|
],
|
||||||
[points[leng - 2]]
|
points[leng - 2]
|
||||||
)
|
]
|
||||||
)
|
)
|
||||||
dedup(pts);
|
dedup(pts);
|
@@ -4,7 +4,7 @@ use <../util/dedup.scad>;
|
|||||||
use <vx_polyline.scad>;
|
use <vx_polyline.scad>;
|
||||||
|
|
||||||
function vx_polygon(points, filled = false) =
|
function vx_polygon(points, filled = false) =
|
||||||
let(contour = vx_polyline(concat(points, [points[0]])))
|
let(contour = vx_polyline([each points, points[0]]))
|
||||||
!filled ? contour :
|
!filled ? contour :
|
||||||
let(
|
let(
|
||||||
sortedXY = sort(contour, by = "vt"),
|
sortedXY = sort(contour, by = "vt"),
|
||||||
|
Reference in New Issue
Block a user