mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-09 00:06:42 +02:00
add _vertex_normals
This commit is contained in:
44
src/__comm__/_vertex_normals.scad
Normal file
44
src/__comm__/_vertex_normals.scad
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
use <../util/slice.scad>;
|
||||||
|
use <../util/sort.scad>;
|
||||||
|
use <../util/find_index.scad>;
|
||||||
|
use <../util/sum.scad>;
|
||||||
|
|
||||||
|
ascending = function(e1, e2) e1 - e2;
|
||||||
|
|
||||||
|
function connected_faces(leng_pts, faces) =
|
||||||
|
let(
|
||||||
|
leng = len(faces),
|
||||||
|
cnt_faces = [for(i = [0:leng_pts - 1]) []]
|
||||||
|
)
|
||||||
|
_connected_faces(faces, leng, leng_pts, cnt_faces);
|
||||||
|
|
||||||
|
function _connected_faces(faces, leng, leng_pts, cnt_faces, i = 0) =
|
||||||
|
i == leng ? cnt_faces :
|
||||||
|
let(
|
||||||
|
facei = sort(faces[i], by = ascending),
|
||||||
|
n_cnt_faces = [
|
||||||
|
for(k = [0:leng_pts - 1])
|
||||||
|
find_index(facei, function(e) e == k) != -1 ? concat(cnt_faces[k], [faces[i]]) : cnt_faces[k]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
_connected_faces(faces, leng, leng_pts, n_cnt_faces, i + 1);
|
||||||
|
|
||||||
|
function face_normal(points) =
|
||||||
|
let(v = cross(points[2] - points[0], points[1] - points[0])) v / norm(v);
|
||||||
|
|
||||||
|
function _vertex_normals(points, faces) =
|
||||||
|
let(
|
||||||
|
leng_pts = len(points),
|
||||||
|
cnn_faces = connected_faces(leng_pts, faces)
|
||||||
|
)
|
||||||
|
[
|
||||||
|
for(i = [0:leng_pts - 1])
|
||||||
|
let(
|
||||||
|
face_normals = [
|
||||||
|
for(face = cnn_faces[i])
|
||||||
|
face_normal([for(i = face) points[i]])
|
||||||
|
]
|
||||||
|
)
|
||||||
|
sum(face_normals) / len(face_normals)
|
||||||
|
];
|
Reference in New Issue
Block a user