diff --git a/city_model_structure/attributes/surface.py b/city_model_structure/attributes/surface.py index 4f2b38da..d61d55d4 100644 --- a/city_model_structure/attributes/surface.py +++ b/city_model_structure/attributes/surface.py @@ -278,14 +278,12 @@ class Surface: """ if self._normal is None: points = self.points - accepted_normal_difference = 0.01 # todo: IF THE FIRST ONE IS 0, START WITH THE NEXT point_origin = points[len(points)-2] vector_1 = points[len(points)-1] - point_origin vector_2 = points[0] - point_origin vector_3 = points[1] - point_origin cross_product = np.cross(vector_1, vector_2) - cross_product_next = np.cross(vector_2, vector_3) if np.linalg.norm(cross_product) != 0: cross_product = cross_product / np.linalg.norm(cross_product) alpha = GeometryHelper.angle_between_vectors(vector_1, vector_2) @@ -295,45 +293,38 @@ class Surface: alpha = 0 if len(points) == 3: return cross_product - if np.linalg.norm(cross_product_next) != 0: - cross_product_next = cross_product_next / np.linalg.norm(cross_product_next) - beta = GeometryHelper.angle_between_vectors(vector_2, vector_3) - else: - cross_product_next = [0, 0, 0] - beta = 0 - delta_normals = 0 - for j in range(0, 3): - delta_normals += cross_product[j] - cross_product_next[j] - if np.abs(delta_normals) < accepted_normal_difference: - alpha += beta - else: - alpha -= beta + alpha += self._angle(vector_2, vector_3, cross_product) for i in range(0, len(points)-4): vector_1 = points[i+1] - point_origin vector_2 = points[i+2] - point_origin - cross_product_next = np.cross(vector_1, vector_2) - if np.linalg.norm(cross_product_next) != 0: - cross_product_next = cross_product_next / np.linalg.norm(cross_product_next) - beta = GeometryHelper.angle_between_vectors(vector_1, vector_2) - else: - cross_product_next = [0, 0, 0] - beta = 0 - delta_normals = 0 - for j in range(0, 3): - delta_normals += cross_product[j] - cross_product_next[j] - if np.abs(delta_normals) < accepted_normal_difference: - alpha += beta - else: - alpha -= beta + alpha += self._angle(vector_1, vector_2, cross_product) + vector_1 = points[len(points) - 1] - point_origin + vector_2 = points[0] - point_origin if alpha < 0: - cross_product = np.cross(points[0] - points[len(points) - 2], - points[len(points) - 1] - points[len(points) - 2]) + cross_product = np.cross(vector_2, vector_1) else: - cross_product = np.cross(points[len(points) - 1] - points[len(points) - 2], - points[0] - points[len(points) - 2]) + cross_product = np.cross(vector_1, vector_2) self._normal = cross_product / np.linalg.norm(cross_product) return self._normal + @staticmethod + def _angle(vector_1, vector_2, cross_product): + accepted_normal_difference = 0.01 + cross_product_next = np.cross(vector_1, vector_2) + if np.linalg.norm(cross_product_next) != 0: + cross_product_next = cross_product_next / np.linalg.norm(cross_product_next) + alpha = GeometryHelper.angle_between_vectors(vector_1, vector_2) + else: + cross_product_next = [0, 0, 0] + alpha = 0 + delta_normals = 0 + for j in range(0, 3): + delta_normals += cross_product[j] - cross_product_next[j] + if np.abs(delta_normals) < accepted_normal_difference: + return alpha + else: + return -alpha + @property def azimuth(self): """