diff --git a/lib/geometry/geometry3d.cpp b/lib/geometry/geometry3d.cpp index a8907fb..5d75cef 100644 --- a/lib/geometry/geometry3d.cpp +++ b/lib/geometry/geometry3d.cpp @@ -128,11 +128,18 @@ gctl::point3dc gctl::geometry3d::line_on_plane(const point3dc &face_p, const poi return m; } -gctl::point3dc gctl::geometry3d::track_ellipse(const point3dc &v1, const point3dc &v2, double phi) +gctl::point3ds gctl::geometry3d::track_sphere_arc(const point3ds &v1, const point3ds &v2, double arc) { - // Phi为弧度表示 - double Phi = angle(v1, v2); - return cos(phi)*v1 + sin(phi)/sin(Phi)*(v2 - cos(Phi)*v1); + if (fabs(v1.rad - v2.rad) > 1e-10) + { + throw std::runtime_error("[gctl::geometry3d::track_sphere_arc] Invalid radius."); + } + + point3dc p1 = v1.s2c(), p2 = v2.s2c(); + double Phi = angle(p1, p2); // Phi为弧度表示 + point3dc pc = cos(arc)*p1 + sin(arc)/sin(Phi)*(p2 - cos(Phi)*p1); + + return pc.c2s(); } gctl::point3dc gctl::geometry3d::dot_on_plane(const point3dc &face_dot, const point3dc &face_nor, diff --git a/lib/geometry/geometry3d.h b/lib/geometry/geometry3d.h index 91ed79c..728a217 100644 --- a/lib/geometry/geometry3d.h +++ b/lib/geometry/geometry3d.h @@ -156,18 +156,15 @@ namespace gctl point3dc line_on_plane(const point3dc &face_p, const point3dc &face_nor, const point3dc &line_p, const point3dc &line_nor); /** - * @brief 计算两个矢量之间的椭圆弧上的任意一点 - * - * 三维空间中任意两个以原点为起点矢量可视为一个三维椭圆弧上的两个点,给定这两个点与需要计算的第三点矢量 - * 与起点矢量的夹角可以获得计算点坐标。 + * @brief 计算球面上两点之间大圆弧(劣弧)上的任意一点,给定计算点与起点的夹角可以获得其坐标。 * - * @param[in] v1 起点矢量 - * @param[in] v2 终点矢量 - * @param[in] phi 计算点矢量与起点矢量之间的夹角(弧度) + * @param[in] v1 起点 + * @param[in] v2 终点 + * @param[in] arc 计算点与起点之间的夹角(弧度) * * @return 返回计算点坐标 */ - point3dc track_ellipse(const point3dc &v1, const point3dc &v2, double phi); + point3ds track_sphere_arc(const point3ds &v1, const point3ds &v2, double arc); /** * @brief 点在平面上的投影 *