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:
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