#pragma once #include "vec.hpp" #include #include #include class ILineParam { public: virtual ~ILineParam() = default; }; struct PolylineParam : ILineParam { int segIdx; real tOnSeg; }; struct PolynomialLineParam : ILineParam { real t; }; class ILine { public: virtual ~ILine() = default; virtual Vec3 eval(const ILineParam& param) const = 0; virtual Vec3 tangent(const ILineParam& param) const = 0; virtual std::unique_ptr getClosestParam(const Vec3& p) const = 0; }; template using PtArray = std::vector >; using Pt3Array = PtArray<3>; using Pt2Array = PtArray<2>; template class Polyline: public ILine { public: Polyline(const PtArray &points, const std::vector &bugles, bool closed = false) : points(points), bugles(bugles), closed(closed) { assert(points.size() >= 2); if (closed) { assert(points.size() == bugles.size()); } else { assert(points.size() - 1 == bugles.size() || points.size() == bugles.size()); } } using Point = Vec; private: PtArray points; std::vector bugles; bool closed; public: Vec3 eval(const ILineParam& param) const override { const PolylineParam* polyParam = dynamic_cast(¶m); // 进行类型检查 if (!polyParam) { throw std::invalid_argument("Invalid parameter type for Polyline::eval"); } // TODO: } Vec3 tangent(const ILineParam& param) const override { // TODO: } std::unique_ptr getClosestParam(const Vec3& p) const override { auto closestParam = std::make_unique(); // TODO: return closestParam; } void addPoint(const Point &point) { points.push_back(point); } const Point &getPoint(size_t index) const { return points[index]; } size_t size() const { return points.size(); } void clear() { points.clear(); } void print() const { for (const auto &point: points) { std::cout << "("; for (size_t i = 0; i < N; ++i) { std::cout << point[i]; if (i < N - 1) std::cout << ", "; } std::cout << ") "; } std::cout << std::endl; } }; class PolynomialLine: public ILine { public: };