Browse Source

fix wrong direction and derivatives

V2-integral-fix
Zhicheng Wang 1 week ago
parent
commit
6fa55037fb
  1. 10
      primitive_process/src/subface/simple/cylinder_face.cpp
  2. 4
      primitive_process/src/subface/simple/plane.cpp
  3. 14
      primitive_process/src/subface/simple/sphere_face.cpp

10
primitive_process/src/subface/simple/cylinder_face.cpp

@ -26,7 +26,7 @@ Eigen::Vector4d sphere_function_impl::map_param_to_point(pointer_wrapper<subface
{ {
const auto cos_u = std::cos(p.x()); const auto cos_u = std::cos(p.x());
const auto sin_u = std::sin(p.x()); const auto sin_u = std::sin(p.x());
return object->local_to_world * Eigen::Vector4d(cos_u, p.y(), sin_u, 1.0); return object->local_to_world * Eigen::Vector4d(cos_u, sin_u, p.y(), 1.0);
} }
Eigen::Vector2d sphere_function_impl::map_point_to_param(pointer_wrapper<subface> object, Eigen::Vector3d p) Eigen::Vector2d sphere_function_impl::map_point_to_param(pointer_wrapper<subface> object, Eigen::Vector3d p)
@ -43,8 +43,8 @@ internal::constraint_curve_intermediate sphere_function_impl::eval_du_constraint
const auto cos_u = std::cos(p.x()); const auto cos_u = std::cos(p.x());
const auto sin_u = std::sin(p.x()); const auto sin_u = std::sin(p.x());
res.f = object->local_to_world * Eigen::Vector4d(cos_u, p.y(), sin_u, 1.0); res.f = object->local_to_world * Eigen::Vector4d(cos_u, sin_u, p.y(), 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(0, 1, 0, 0.0); res.grad_f = object->local_to_world * Eigen::Vector4d(-sin_u, cos_u, 0, 0.0);
return res; return res;
} }
@ -57,8 +57,8 @@ internal::constraint_curve_intermediate sphere_function_impl::eval_dv_constraint
const auto cos_u = std::cos(p.x()); const auto cos_u = std::cos(p.x());
const auto sin_u = std::sin(p.x()); const auto sin_u = std::sin(p.x());
res.f = object->local_to_world * Eigen::Vector4d(cos_u, p.y(), sin_u, 1.0); res.f = object->local_to_world * Eigen::Vector4d(cos_u, sin_u, p.y(), 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(-sin_u, 0.0, cos_u, 0.0); res.grad_f = object->local_to_world * Eigen::Vector4d(0, 0, 1, 0.0);
return res; return res;
} }

4
primitive_process/src/subface/simple/plane.cpp

@ -30,7 +30,7 @@ internal::constraint_curve_intermediate plane_function_impl::eval_du_constraint(
internal::constraint_curve_intermediate res{}; internal::constraint_curve_intermediate res{};
res.f = object->local_to_world * Eigen::Vector4d(0, p.x(), p.y(), 1.0); res.f = object->local_to_world * Eigen::Vector4d(0, p.x(), p.y(), 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(0, 0, 1, 0.0); res.grad_f = object->local_to_world * Eigen::Vector4d(0, 1, 0, 0.0);
return res; return res;
} }
@ -41,7 +41,7 @@ internal::constraint_curve_intermediate plane_function_impl::eval_dv_constraint(
internal::constraint_curve_intermediate res{}; internal::constraint_curve_intermediate res{};
res.f = object->local_to_world * Eigen::Vector4d(0, p.x(), p.y(), 1.0); res.f = object->local_to_world * Eigen::Vector4d(0, p.x(), p.y(), 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(0, 1, 0, 0.0); res.grad_f = object->local_to_world * Eigen::Vector4d(0, 0, 1, 0.0);
return res; return res;
} }

14
primitive_process/src/subface/simple/sphere_face.cpp

@ -28,14 +28,14 @@ Eigen::Vector4d cylinder_function_impl::map_param_to_point(pointer_wrapper<subfa
const auto sin_u = std::sin(p.x()); const auto sin_u = std::sin(p.x());
const auto cos_v = std::cos(p.y()); const auto cos_v = std::cos(p.y());
const auto sin_v = std::sin(p.y()); const auto sin_v = std::sin(p.y());
return object->local_to_world * Eigen::Vector4d(cos_u * cos_v, sin_v, sin_u * cos_v, 1.0); return object->local_to_world * Eigen::Vector4d(cos_u * cos_v, sin_u * cos_v, sin_v, 1.0);
} }
Eigen::Vector2d cylinder_function_impl::map_point_to_param(pointer_wrapper<subface> object, Eigen::Vector3d p) Eigen::Vector2d cylinder_function_impl::map_point_to_param(pointer_wrapper<subface> object, Eigen::Vector3d p)
{ {
Eigen::Vector4d local_p = (object->world_to_local * Eigen::Vector4d{p.x(), p.y(), p.z(), 1.0}).normalized(); Eigen::Vector4d local_p = (object->world_to_local * Eigen::Vector4d{p.x(), p.y(), p.z(), 1.0}).normalized();
const auto u = std::atan2(local_p.z(), local_p.x()); const auto u = std::atan2(local_p.y(), local_p.x());
const auto v = std::asin(local_p.y()); const auto v = std::asin(local_p.z());
return Eigen::Vector2d{u, v}; return Eigen::Vector2d{u, v};
} }
@ -49,8 +49,8 @@ internal::constraint_curve_intermediate cylinder_function_impl::eval_du_constrai
const auto cos_v = std::cos(p.y()); const auto cos_v = std::cos(p.y());
const auto sin_v = std::sin(p.y()); const auto sin_v = std::sin(p.y());
res.f = object->local_to_world * Eigen::Vector4d(cos_u * cos_v, sin_v, sin_u * cos_v, 1.0); res.f = object->local_to_world * Eigen::Vector4d(cos_u * cos_v, sin_u * cos_v, sin_v, 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(cos_u * -sin_v, cos_v, sin_u * -sin_v, 0.0); res.grad_f = object->local_to_world * Eigen::Vector4d(-sin_u * cos_v, cos_u * cos_v, 0, 0.0);
return res; return res;
} }
@ -65,8 +65,8 @@ internal::constraint_curve_intermediate cylinder_function_impl::eval_dv_constrai
const auto cos_v = std::cos(p.y()); const auto cos_v = std::cos(p.y());
const auto sin_v = std::sin(p.y()); const auto sin_v = std::sin(p.y());
res.f = object->local_to_world * Eigen::Vector4d(cos_u * cos_v, sin_v, sin_u * cos_v, 1.0); res.f = object->local_to_world * Eigen::Vector4d(cos_u * cos_v, sin_u * cos_v, sin_v, 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(-sin_u * cos_v, 0.0, cos_u * cos_v, 0.0); res.grad_f = object->local_to_world * Eigen::Vector4d(cos_u * -sin_v, sin_u * -sin_v, cos_v, 0.0);
return res; return res;
} }

Loading…
Cancel
Save