#pragma once #include namespace internal { // local: cylinder face x^2+y^2-1=0 struct cylinder_face_t final : subface { static constexpr uint64_t max_degree = 2; static constexpr equation_system_type eq_sys_type = equation_system_type::implicit; std::function fetch_sdf_evaluator() const override; std::function fetch_sdf_grad_evaluator() const override; // u: planar angle from x-axis to z-axis // v: depth/height from xz-plane to y-axis std::function fetch_point_by_param_evaluator() const override; std::function fetch_param_mapping_evaluator() const override; std::function fetch_curve_constraint_evaluator(parameter_u_t constraint_var_type, double u) const override; std::function fetch_curve_constraint_evaluator(parameter_v_t constraint_var_type, double v) const override; std::function fetch_solver_evaluator() const override; }; } // namespace internal namespace detail { struct cylinder_surface_tag{}; template <> struct tagged_hasher { size_t operator()(const internal::paired_model_matrix& block) const { auto R = block.world_to_local.linear().topLeftCorner<2, 3>(); // 2x3 auto b = block.local_to_world.translation(); // 3x1 Eigen::Matrix hash_mat = Eigen::Matrix3d::Zero(); hash_mat.topLeftCorner<3, 3>() = R.transpose() * R; hash_mat.topRightCorner<2, 1>() = R * b; return hash_funcs(hash_mat); } }; template <> struct default_elem_ctor { internal::cylinder_face_t operator()(internal::paired_model_matrix& k) const { internal::cylinder_face_t res{}; res.model_matrices = make_pointer_wrapper(k); return res; } }; } // namespace detail