1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-12 09:44:16 +02:00
This commit is contained in:
Justin Lin
2020-01-26 20:37:33 +08:00
parent 07d96b2e10
commit 8eabde6be9
3 changed files with 206 additions and 202 deletions

View File

@@ -0,0 +1,202 @@
use <__comm__/__to3d.scad>;
use <__comm__/__to2d.scad>;
function _px_line_zsgn(a) = a == 0 ? a : a / abs(a);
// x-dominant
function _px_line_xdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y;
function _px_line_xdominant_yd(yd, ax, ay) = (yd >= 0 ? yd - ax : yd) + ay;
function _px_line_xdominant_z(z, zd, sz) = zd >= 0 ? z + sz : z;
function _px_line_xdominant_zd(zd, ax, az) = (zd >= 0 ? zd - ax : zd) + az;
function _px_line_xdominant(start, end, a, s) =
let(
x = start[0],
y = start[1],
z = start[2],
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2],
shrx = floor(ax / 2),
yd = ay - shrx,
zd = az - shrx,
endx = end[0]
)
concat(
[start],
_px_line_xdominant_sub(
x + sx,
_px_line_xdominant_y(y, yd, sy),
_px_line_xdominant_z(z, zd, sz),
endx,
a,
s,
_px_line_xdominant_yd(yd, ax, ay),
_px_line_xdominant_zd(zd, ax, az)
)
);
function _px_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) =
let(
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2]
)
x == endx ? [] :
concat([[x, y, z]],
_px_line_xdominant_sub(
x + sx,
_px_line_xdominant_y(y, yd, sy),
_px_line_xdominant_z(z, zd, sz),
endx,
a,
s,
_px_line_xdominant_yd(yd, ax, ay),
_px_line_xdominant_zd(zd, ax, az)
)
);
// y-dominant
function _px_line_ydominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
function _px_line_ydominant_xd(xd, ax, ay) = (xd >= 0 ? xd - ay : xd) + ax;
function _px_line_ydominant_z(z, zd, sz) = zd >= 0 ? z + sz : z;
function _px_line_ydominant_zd(zd, ay, az) = (zd >= 0 ? zd - ay : zd) + az;
function _px_line_ydominant(start, end, a, s) =
let(
x = start[0],
y = start[1],
z = start[2],
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2],
shry = floor(ay / 2),
xd = ax - shry,
zd = az - shry,
endy = end[1]
)
concat(
[start],
_px_line_ydominant_sub(
_px_line_ydominant_x(x, xd, sx),
y + sy,
_px_line_ydominant_z(z, zd, sz),
endy,
a,
s,
_px_line_ydominant_xd(xd, ax, ay),
_px_line_ydominant_zd(zd, ay, az)
)
);
function _px_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) =
let(
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2]
)
y == endy ? [] :
concat([[x, y, z]],
_px_line_ydominant_sub(
_px_line_ydominant_x(x, xd, sx),
y + sy,
_px_line_ydominant_z(z, zd, sz),
endy,
a,
s,
_px_line_ydominant_xd(xd, ax, ay),
_px_line_ydominant_zd(zd, ay, az)
)
);
// z-dominant
function _px_line_zdominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
function _px_line_zdominant_xd(xd, ax, az) = (xd >= 0 ? xd - az : xd) + ax;
function _px_line_zdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y;
function _px_line_zdominant_yd(yd, ay, az) = (yd >= 0 ? yd - az : yd) + ay;
function _px_line_zdominant(start, end, a, s) =
let(
x = start[0],
y = start[1],
z = start[2],
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2],
shrz = floor(az / 2),
xd = ax - shrz,
yd = ay - shrz,
endz = end[2]
)
concat(
[start],
_px_line_zdominant_sub(
_px_line_zdominant_x(x, xd, sx),
_px_line_zdominant_y(y, yd, sy),
z + sz,
endz,
a,
s,
_px_line_zdominant_xd(xd, ax, az),
_px_line_zdominant_yd(yd, ay, az)
)
);
function _px_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) =
let(
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2]
)
z == endz ? [] :
concat([[x, y, z]],
_px_line_zdominant_sub(
_px_line_zdominant_x(x, xd, sx),
_px_line_zdominant_y(y, yd, sy),
z + sz,
endz,
a,
s,
_px_line_zdominant_xd(xd, ax, az),
_px_line_zdominant_yd(yd, ay, az)
)
);
function _px_line_impl(p1, p2) =
let(
is_2d = len(p1) == 2,
start_pt = is_2d ? __to3d(p1) : p1,
end_pt = is_2d ? __to3d(p2) : p2,
dt = end_pt - start_pt,
ax = floor(abs(dt[0]) * 2),
ay = floor(abs(dt[1]) * 2),
az = floor(abs(dt[2]) * 2),
sx = _px_line_zsgn(dt[0]),
sy = _px_line_zsgn(dt[1]),
sz = _px_line_zsgn(dt[2]),
points = ax >= max(ay, az) ? _px_line_xdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) : (
ay >= max(ax, az) ? _px_line_ydominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) :
_px_line_zdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz])
)
)
is_2d ? [for(pt = points) __to2d(pt)] : points;

View File

@@ -8,204 +8,6 @@
*
**/
include <__comm__/__to3d.scad>;
include <__comm__/__to2d.scad>;
use <pixel/_impl/_px_line_impl.scad>;
function _px_line_zsgn(a) = a == 0 ? a : a / abs(a);
// x-dominant
function _px_line_xdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y;
function _px_line_xdominant_yd(yd, ax, ay) = (yd >= 0 ? yd - ax : yd) + ay;
function _px_line_xdominant_z(z, zd, sz) = zd >= 0 ? z + sz : z;
function _px_line_xdominant_zd(zd, ax, az) = (zd >= 0 ? zd - ax : zd) + az;
function _px_line_xdominant(start, end, a, s) =
let(
x = start[0],
y = start[1],
z = start[2],
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2],
shrx = floor(ax / 2),
yd = ay - shrx,
zd = az - shrx,
endx = end[0]
)
concat(
[start],
_px_line_xdominant_sub(
x + sx,
_px_line_xdominant_y(y, yd, sy),
_px_line_xdominant_z(z, zd, sz),
endx,
a,
s,
_px_line_xdominant_yd(yd, ax, ay),
_px_line_xdominant_zd(zd, ax, az)
)
);
function _px_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) =
let(
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2]
)
x == endx ? [] :
concat([[x, y, z]],
_px_line_xdominant_sub(
x + sx,
_px_line_xdominant_y(y, yd, sy),
_px_line_xdominant_z(z, zd, sz),
endx,
a,
s,
_px_line_xdominant_yd(yd, ax, ay),
_px_line_xdominant_zd(zd, ax, az)
)
);
// y-dominant
function _px_line_ydominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
function _px_line_ydominant_xd(xd, ax, ay) = (xd >= 0 ? xd - ay : xd) + ax;
function _px_line_ydominant_z(z, zd, sz) = zd >= 0 ? z + sz : z;
function _px_line_ydominant_zd(zd, ay, az) = (zd >= 0 ? zd - ay : zd) + az;
function _px_line_ydominant(start, end, a, s) =
let(
x = start[0],
y = start[1],
z = start[2],
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2],
shry = floor(ay / 2),
xd = ax - shry,
zd = az - shry,
endy = end[1]
)
concat(
[start],
_px_line_ydominant_sub(
_px_line_ydominant_x(x, xd, sx),
y + sy,
_px_line_ydominant_z(z, zd, sz),
endy,
a,
s,
_px_line_ydominant_xd(xd, ax, ay),
_px_line_ydominant_zd(zd, ay, az)
)
);
function _px_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) =
let(
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2]
)
y == endy ? [] :
concat([[x, y, z]],
_px_line_ydominant_sub(
_px_line_ydominant_x(x, xd, sx),
y + sy,
_px_line_ydominant_z(z, zd, sz),
endy,
a,
s,
_px_line_ydominant_xd(xd, ax, ay),
_px_line_ydominant_zd(zd, ay, az)
)
);
// z-dominant
function _px_line_zdominant_x(x, xd, sx) = xd >= 0 ? x + sx : x;
function _px_line_zdominant_xd(xd, ax, az) = (xd >= 0 ? xd - az : xd) + ax;
function _px_line_zdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y;
function _px_line_zdominant_yd(yd, ay, az) = (yd >= 0 ? yd - az : yd) + ay;
function _px_line_zdominant(start, end, a, s) =
let(
x = start[0],
y = start[1],
z = start[2],
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2],
shrz = floor(az / 2),
xd = ax - shrz,
yd = ay - shrz,
endz = end[2]
)
concat(
[start],
_px_line_zdominant_sub(
_px_line_zdominant_x(x, xd, sx),
_px_line_zdominant_y(y, yd, sy),
z + sz,
endz,
a,
s,
_px_line_zdominant_xd(xd, ax, az),
_px_line_zdominant_yd(yd, ay, az)
)
);
function _px_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) =
let(
ax = a[0],
ay = a[1],
az = a[2],
sx = s[0],
sy = s[1],
sz = s[2]
)
z == endz ? [] :
concat([[x, y, z]],
_px_line_zdominant_sub(
_px_line_zdominant_x(x, xd, sx),
_px_line_zdominant_y(y, yd, sy),
z + sz,
endz,
a,
s,
_px_line_zdominant_xd(xd, ax, az),
_px_line_zdominant_yd(yd, ay, az)
)
);
function px_line(p1, p2) =
let(
is_2d = len(p1) == 2,
start_pt = is_2d ? __to3d(p1) : p1,
end_pt = is_2d ? __to3d(p2) : p2,
dt = end_pt - start_pt,
ax = floor(abs(dt[0]) * 2),
ay = floor(abs(dt[1]) * 2),
az = floor(abs(dt[2]) * 2),
sx = _px_line_zsgn(dt[0]),
sy = _px_line_zsgn(dt[1]),
sz = _px_line_zsgn(dt[2]),
points = ax >= max(ay, az) ? _px_line_xdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) : (
ay >= max(ax, az) ? _px_line_ydominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) :
_px_line_zdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz])
)
)
is_2d ? [for(pt = points) __to2d(pt)] : points;
function px_line(p1, p2) = _px_line_impl(p1, p2);

View File

@@ -1,5 +1,5 @@
include <unittest.scad>;
include <pixel/px_line.scad>;
use <unittest.scad>;
use <pixel/px_line.scad>;
module test_px_line() {
echo("==== test_px_line ====");