def get_3d_vmob_unit_normal(vmob, point_index): n_points = vmob.get_num_points() if vmob.get_num_points() == 0: return np.array(ORIGIN) i = point_index im1 = i - 1 if i > 0 else (n_points - 2) ip1 = i + 1 if i < (n_points - 1) else 1 return get_unit_normal( vmob.points[ip1] - vmob.points[i], vmob.points[im1] - vmob.points[i], )
def get_3d_vmob_unit_normal(vmob, point_index): n_points = vmob.get_num_points() if len(vmob.get_anchors()) <= 2: return np.array(UP) i = point_index im3 = i - 3 if i > 2 else (n_points - 4) ip3 = i + 3 if i < (n_points - 3) else 3 unit_normal = get_unit_normal( vmob.points[ip3] - vmob.points[i], vmob.points[im3] - vmob.points[i], ) if get_norm(unit_normal) == 0: return np.array(UP) return unit_normal
def get_unit_normal(self, recompute=False): if not recompute: return self.data["unit_normal"][0] if self.get_num_points() < 3: return OUT area_vect = self.get_area_vector() area = get_norm(area_vect) if area > 0: return area_vect / area else: points = self.get_points() return get_unit_normal( points[1] - points[0], points[2] - points[1], )
def get_unit_normal(self, recompute: bool = False) -> np.ndarray: if not recompute: return self.data["unit_normal"][0] if self.get_num_points() < 3: return OUT area_vect = self.get_area_vector() area = get_norm(area_vect) if area > 0: normal = area_vect / area else: points = self.get_points() normal = get_unit_normal( points[1] - points[0], points[2] - points[1], ) self.data["unit_normal"][:] = normal return normal