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 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)
@ -43,8 +43,8 @@ internal::constraint_curve_intermediate sphere_function_impl::eval_du_constraint
const auto cos_u = std::cos(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.grad_f = object->local_to_world * Eigen::Vector4d(0, 1, 0, 0.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, cos_u, 0, 0.0);
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 sin_u = std::sin(p.x());
res.f = object->local_to_world * Eigen::Vector4d(cos_u, p.y(), sin_u, 1.0);
res.grad_f = object->local_to_world * Eigen::Vector4d(-sin_u, 0.0, cos_u, 0.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, 0, 1, 0.0);
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{};
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;
}
@ -41,7 +41,7 @@ internal::constraint_curve_intermediate plane_function_impl::eval_dv_constraint(
internal::constraint_curve_intermediate res{};
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;
}

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 cos_v = std::cos(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::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 v = std::asin(local_p.y());
const auto u = std::atan2(local_p.y(), local_p.x());
const auto v = std::asin(local_p.z());
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 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.grad_f = object->local_to_world * Eigen::Vector4d(cos_u * -sin_v, cos_v, sin_u * -sin_v, 0.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, cos_u * cos_v, 0, 0.0);
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 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.grad_f = object->local_to_world * Eigen::Vector4d(-sin_u * cos_v, 0.0, cos_u * cos_v, 0.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, sin_u * -sin_v, cos_v, 0.0);
return res;
}

Loading…
Cancel
Save