From aaaebdc042324f30b49b2077a63126214b8b2a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Tue, 13 Feb 2018 16:14:28 +0100 Subject: [PATCH] Normalize normals to norm 1 --- Implicit.cpp | 10 ++++++---- Mesh.cpp | 2 +- common_structures.hpp | 11 +++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Implicit.cpp b/Implicit.cpp index 2ab78eb..c14422b 100644 --- a/Implicit.cpp +++ b/Implicit.cpp @@ -8,11 +8,13 @@ Point ImplicitSurface::normal_at(const Point& pt) const { // this is simply the gradient. static const double d_dist = 1e-8; - return Point( + Point normal( (operator()(pt.x + d_dist, pt.y, pt.z) - - operator()(pt.x - d_dist, pt.y, pt.z)) / (2. * d_dist), + operator()(pt.x - d_dist, pt.y, pt.z)) / (2. * d_dist), (operator()(pt.x, pt.y + d_dist, pt.z) - - operator()(pt.x, pt.y - d_dist, pt.z)) / (2. * d_dist), + operator()(pt.x, pt.y - d_dist, pt.z)) / (2. * d_dist), (operator()(pt.x, pt.y, pt.z + d_dist) - - operator()(pt.x, pt.y, pt.z - d_dist)) / (2. * d_dist)); + operator()(pt.x, pt.y, pt.z - d_dist)) / (2. * d_dist)); + normal.normalize(); + return normal; } diff --git a/Mesh.cpp b/Mesh.cpp index a0b4a24..b805de3 100644 --- a/Mesh.cpp +++ b/Mesh.cpp @@ -91,7 +91,7 @@ void Mesh::compute_normal(size_t vert) { normal += e1.cross_prod(e2); } - normal = (1. / ((double) faces_with_vert[vert].size())) * normal; + normal.normalize(); normals[vert].dirty = false; normals[vert].vect = normal; } diff --git a/common_structures.hpp b/common_structures.hpp index df3453a..2b5f4b0 100644 --- a/common_structures.hpp +++ b/common_structures.hpp @@ -13,6 +13,17 @@ struct Point { Point(double x, double y, double z) : x(x), y(y), z(z) {} double x, y, z; + double norm() const { + auto sq = [](double x) { return x * x; }; + return sqrt(sq(x) + sq(y) + sq(z)); + } + void normalize() { + double _norm = norm(); + x /= _norm; + y /= _norm; + z /= _norm; + } + double operator[](unsigned i) const { assert(i < 3); switch(i) {