Compare commits

...

13 commits

Author SHA1 Message Date
adrianVmariano
aa9a78cd01
Merge ef610906b0 into 53af9121e7 2024-09-02 01:21:54 +00:00
Adrian Mariano
ef610906b0 Change VNF hull anchors to point in more rational directions 2024-09-01 21:21:24 -04:00
Revar Desmera
53af9121e7
Merge pull request #1464 from adrianVmariano/master
doc fix & screws fix
2024-08-11 22:48:27 -07:00
Revar Desmera
736fad321b
Merge pull request #1459 from adrianVmariano/master 2024-07-27 14:01:30 -07:00
Revar Desmera
cc08eb3323
Merge pull request #1458 from adrianVmariano/master
Fix new examples
2024-07-27 02:21:31 -07:00
Revar Desmera
78ea8e4770
Merge pull request #1457 from adrianVmariano/master
vnf_sheet & bezier_sheet
2024-07-25 23:01:31 -07:00
Revar Desmera
8383d360cc
Merge pull request #1454 from adrianVmariano/master
various fixes
2024-07-19 21:35:00 -07:00
Revar Desmera
9145c0961f
Merge pull request #1450 from BelfrySCAD/revarbat_dev
Remove redundant collinear points from bezpath_curve() output.
2024-07-07 00:34:15 -07:00
Revar Desmera
ebb98b47d2 Remove redundant collinear points from bezpath_curve() output. 2024-07-07 00:11:23 -07:00
Revar Desmera
8ea8ebf341
Merge pull request #1447 from adrianVmariano/master
su/product optimization
2024-06-29 15:41:11 -07:00
Revar Desmera
17e307fdb4
Merge pull request #1446 from adrianVmariano/master
projection doc fix
2024-06-22 20:58:13 -07:00
Revar Desmera
67f0004773
Merge pull request #1445 from adrianVmariano/master
add projection()
2024-06-22 18:10:12 -07:00
Revar Desmera
76d09271c1
Merge pull request #1441 from adrianVmariano/master
spiral sweep bugfix
2024-06-12 22:57:08 -07:00
3 changed files with 66 additions and 7 deletions

View file

@ -3742,10 +3742,42 @@ function _find_anchor(anchor, geom) =
rpts = apply(rot(from=anchor, to=RIGHT) * move(point3d(-cp)), vnf[0]),
maxx = max(column(rpts,0)),
idxs = [for (i = idx(rpts)) if (approx(rpts[i].x, maxx)) i],
dir = len(idxs)>2 ? [anchor,oang]
: len(idxs)==2 ?
let(
edgefaces = _vnf_find_edge_faces(vnf,idxs),
edge = select(vnf[0],idxs)
)
len(edgefaces)==0 ? [anchor,oang]
: assert(len(edgefaces)==2, "Invalid polyhedron encountered while computing VNF anchor")
edge[0]==edge[1] ? [anchor,oang] // two "edge" points are the same, so give up
: let(
direction= unit(mean([for(face=edgefaces) polygon_normal(select(vnf[0],vnf[1][face]))])),
edgedir = edge[1]-edge[0],
nz = [for(i=[0:2]) if (!approx(edgedir[i],0)) i],
flip = last(nz) < 0 ? -1 : 1,
spin = _compute_spin(direction, flip*edgedir)
)
[direction,spin]
: let(
vertices = vnf[0],
faces = vnf[1],
cornerfaces = _vnf_find_corner_faces(vnf,idxs[0]), // faces = [3,9,12] indicating which faces
normals = [for(faceind=cornerfaces) polygon_normal(select(vnf[0], faces[faceind]))],
angles = [for(faceind=cornerfaces)
let(
thisface = faces[faceind],
vind = search(idxs[0],thisface)[0]
)
vector_angle(select(vertices, select(thisface,vind-1,vind+1)))
],
direc = unit(angles*normals)
)
[direc, atan2(direc.y,direc.x)+90],
avep = sum(select(rpts,idxs))/len(idxs),
mpt = approx(point2d(anchor),[0,0])? [maxx,0,0] : avep,
pos = point3d(cp) + rot(from=RIGHT, to=anchor, p=mpt)
) [anchor, default(override[0],pos),default(override[1],anchor),default(override[2],oang)]
) [anchor, default(override[0],pos),default(override[1],dir[0]),default(override[2],dir[1])]
) : type == "trapezoid"? ( //size, size2, shift, override
let(all_comps_good = [for (c=anchor) if (c!=sign(c)) 1]==[])
assert(all_comps_good, "All components of an anchor for a rectangle/trapezoid must be -1, 0, or 1")

View file

@ -466,12 +466,15 @@ function bezpath_curve(bezpath, splinesteps=16, N=3, endpoint=true) =
assert(len(bezpath)%N == 1, str("A degree ",N," bezier path should have a multiple of ",N," points in it, plus 1."))
let(
segs = (len(bezpath)-1) / N,
step = 1 / splinesteps
) [
step = 1 / splinesteps,
path = [
for (seg = [0:1:segs-1])
each bezier_points(select(bezpath, seg*N, (seg+1)*N), [0:step:1-step/2]),
if (endpoint) last(bezpath)
];
],
is_closed = approx(path[0], last(path)),
out = path_merge_collinear(path, closed=is_closed)
) out;
// Function: bezpath_closest_point()

View file

@ -2331,5 +2331,29 @@ module vnf_validate(vnf, size=1, show_warns=true, check_isects=false, opacity=0.
}
function _vnf_find_edge_faces(vnf,edge) =
let(
faces = vnf[1],
goodind = [for(i=idx(faces))
let(result=search(edge,faces[i]))
if (result*0==[0,0] &&
(abs(result[0]-result[1])==1
|| (min(result)==0 && max(result)==len(faces[i])-1)))
i
]
)
goodind;
function _vnf_find_corner_faces(vnf,corner) =
let(
faces = vnf[1]
)
[for(i=idx(faces))
let(result=search([corner],faces[i])[0])
if (result!=[])
i];
// vim: expandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap