Follow-up of 81d28c545cc1bbb31ee618934ae3afc72f3fc668 - Distance edge-circle calculated as in Fusion 360

This commit is contained in:
enricoturri1966 2022-09-19 11:44:03 +02:00
parent 81d28c545c
commit c87c9886a5

View File

@ -110,24 +110,25 @@ static std::tuple<double, Vec3d, Vec3d> distance_edge_edge(const Edge& e1, const
static std::tuple<double, Vec3d, Vec3d> distance_edge_circle(const Edge& e, const Circle& c) static std::tuple<double, Vec3d, Vec3d> distance_edge_circle(const Edge& e, const Circle& c)
{ {
const auto& [center, radius, normal] = c; const auto& [center, radius, normal] = c;
const Vec3d e1e2_unit = (e.second - e.first).normalized(); const Vec3d e1e2 = (e.second - e.first);
double dot = std::abs(e1e2_unit.dot(normal)); const Vec3d e1e2_unit = e1e2.normalized();
if (dot < EPSILON) { std::vector<std::tuple<double, Vec3d, Vec3d>> distances;
// edge parallel to circle's plane distances.emplace_back(distance_point_circle(e.first, c));
const Eigen::Hyperplane<double, 3> plane(e1e2_unit, center); distances.emplace_back(distance_point_circle(e.second, c));
const Eigen::ParametrizedLine<double, 3> line(e.first, e1e2_unit);
const Vec3d inter = line.intersectionPoint(plane); const Eigen::Hyperplane<double, 3> plane(e1e2_unit, center);
return distance_point_circle(inter, c); const Eigen::ParametrizedLine<double, 3> line(e.first, e1e2_unit);
} const Vec3d inter = line.intersectionPoint(plane);
else if (std::abs(dot - 1.0) < EPSILON) const Vec3d e1inter = inter - e.first;
// edge parallel to circle's normal if (e1inter.dot(e1e2) >= 0.0 && e1inter.norm() < e1e2.norm())
return distance_point_circle(e.first, c); distances.emplace_back(distance_point_circle(inter, c));
else {
const auto [distance1, v11, v12] = distance_point_circle(e.first, c); std::sort(distances.begin(), distances.end(),
const auto [distance2, v21, v22] = distance_point_circle(e.second, c); [](const std::tuple<double, Vec3d, Vec3d>& item1, const std::tuple<double, Vec3d, Vec3d>& item2) {
return (distance1 <= distance2) ? std::make_tuple(distance1, v11, v12) : std::make_tuple(distance2, v21, v22); return std::get<0>(item1) < std::get<0>(item2);
} });
return distances.front();
} }
static std::tuple<double, Vec3d, Vec3d> distance_plane_plane(const Plane& p1, const Plane& p2) static std::tuple<double, Vec3d, Vec3d> distance_plane_plane(const Plane& p1, const Plane& p2)