1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-01 04:20:27 +02:00

add _vertex_normals

This commit is contained in:
Justin Lin
2021-07-10 09:18:07 +08:00
parent 738076131c
commit 64513c8fb0

View 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)
];