agg_curves.h

来自「这是VCF框架的代码」· C头文件 代码 · 共 696 行 · 第 1/2 页

H
696
字号
        //  0       1       0       -1/3        //  0       1       0       0        //        return curve4_points(            x1,            y1,            (3*x1 + x3) / 3,            (3*y1 + y3) / 3,            (3*x2 - x4) / 3,            (3*y2 - y4) / 3,            x2,            y2);    }    //-----------------------------------------------------------------------    inline curve4_points     hermite_to_bezier(const curve4_points& cp)    {        return hermite_to_bezier(cp[0], cp[1], cp[2], cp[3],                                  cp[4], cp[5], cp[6], cp[7]);    }    //-------------------------------------------------------------curve4_div    class curve4_div    {    public:        curve4_div() :             m_approximation_scale(1.0),            m_angle_tolerance(0.0),            m_cusp_limit(0.0),            m_count(0)        {}        curve4_div(double x1, double y1,                    double x2, double y2,                    double x3, double y3,                   double x4, double y4) :            m_approximation_scale(1.0),            m_angle_tolerance(0.0),            m_cusp_limit(0.0),            m_count(0)        {             init(x1, y1, x2, y2, x3, y3, x4, y4);        }        curve4_div(const curve4_points& cp) :            m_approximation_scale(1.0),            m_angle_tolerance(0.0),            m_count(0)        {             init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);        }        void reset() { m_points.remove_all(); m_count = 0; }        void init(double x1, double y1,                   double x2, double y2,                   double x3, double y3,                  double x4, double y4);        void init(const curve4_points& cp)        {            init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);        }        void approximation_method(curve_approximation_method_e) {}        curve_approximation_method_e approximation_method() const         {             return curve_div;         }        void approximation_scale(double s) { m_approximation_scale = s; }        double approximation_scale() const { return m_approximation_scale;  }        void angle_tolerance(double a) { m_angle_tolerance = a; }        double angle_tolerance() const { return m_angle_tolerance;  }        void cusp_limit(double v)         {             m_cusp_limit = (v == 0.0) ? 0.0 : pi - v;         }        double cusp_limit() const         {             return (m_cusp_limit == 0.0) ? 0.0 : pi - m_cusp_limit;         }        void rewind(unsigned)        {            m_count = 0;        }        unsigned vertex(double* x, double* y)        {            if(m_count >= m_points.size()) return path_cmd_stop;            const point_d& p = m_points[m_count++];            *x = p.x;            *y = p.y;            return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;        }    private:        void bezier(double x1, double y1,                     double x2, double y2,                     double x3, double y3,                     double x4, double y4);        void recursive_bezier(double x1, double y1,                               double x2, double y2,                               double x3, double y3,                               double x4, double y4,                              unsigned level);        double               m_approximation_scale;        double               m_distance_tolerance_square;        double               m_distance_tolerance_manhattan;        double               m_angle_tolerance;        double               m_cusp_limit;        unsigned             m_count;        pod_bvector<point_d> m_points;    };    //-----------------------------------------------------------------curve3    class curve3    {    public:        curve3() : m_approximation_method(curve_div) {}        curve3(double x1, double y1,                double x2, double y2,                double x3, double y3) :            m_approximation_method(curve_div)        {             init(x1, y1, x2, y2, x3, y3);        }        void reset()         {             m_curve_inc.reset();            m_curve_div.reset();        }        void init(double x1, double y1,                   double x2, double y2,                   double x3, double y3)        {            if(m_approximation_method == curve_inc)             {                m_curve_inc.init(x1, y1, x2, y2, x3, y3);            }            else            {                m_curve_div.init(x1, y1, x2, y2, x3, y3);            }        }        void approximation_method(curve_approximation_method_e v)         {             m_approximation_method = v;         }        curve_approximation_method_e approximation_method() const         {             return m_approximation_method;         }        void approximation_scale(double s)         {             m_curve_inc.approximation_scale(s);            m_curve_div.approximation_scale(s);        }        double approximation_scale() const         {             return m_curve_inc.approximation_scale();         }        void angle_tolerance(double a)         {             m_curve_div.angle_tolerance(a);         }        double angle_tolerance() const         {             return m_curve_div.angle_tolerance();         }        void cusp_limit(double v)         {             m_curve_div.cusp_limit(v);         }        double cusp_limit() const         {             return m_curve_div.cusp_limit();          }        void rewind(unsigned path_id)        {            if(m_approximation_method == curve_inc)             {                m_curve_inc.rewind(path_id);            }            else            {                m_curve_div.rewind(path_id);            }        }        unsigned vertex(double* x, double* y)        {            if(m_approximation_method == curve_inc)             {                return m_curve_inc.vertex(x, y);            }            return m_curve_div.vertex(x, y);        }    private:        curve3_inc m_curve_inc;        curve3_div m_curve_div;        curve_approximation_method_e m_approximation_method;    };    //-----------------------------------------------------------------curve4    class curve4    {    public:        curve4() : m_approximation_method(curve_div) {}        curve4(double x1, double y1,                double x2, double y2,                double x3, double y3,               double x4, double y4) :             m_approximation_method(curve_div)        {             init(x1, y1, x2, y2, x3, y3, x4, y4);        }        curve4(const curve4_points& cp) :            m_approximation_method(curve_div)        {             init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);        }        void reset()         {             m_curve_inc.reset();            m_curve_div.reset();        }        void init(double x1, double y1,                   double x2, double y2,                   double x3, double y3,                  double x4, double y4)        {            if(m_approximation_method == curve_inc)             {                m_curve_inc.init(x1, y1, x2, y2, x3, y3, x4, y4);            }            else            {                m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4);            }        }        void init(const curve4_points& cp)        {            init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);        }        void approximation_method(curve_approximation_method_e v)         {             m_approximation_method = v;         }        curve_approximation_method_e approximation_method() const         {             return m_approximation_method;         }        void approximation_scale(double s)         {             m_curve_inc.approximation_scale(s);            m_curve_div.approximation_scale(s);        }        double approximation_scale() const { return m_curve_inc.approximation_scale(); }        void angle_tolerance(double v)         {             m_curve_div.angle_tolerance(v);         }        double angle_tolerance() const         {             return m_curve_div.angle_tolerance();          }        void cusp_limit(double v)         {             m_curve_div.cusp_limit(v);         }        double cusp_limit() const         {             return m_curve_div.cusp_limit();          }        void rewind(unsigned path_id)        {            if(m_approximation_method == curve_inc)             {                m_curve_inc.rewind(path_id);            }            else            {                m_curve_div.rewind(path_id);            }        }        unsigned vertex(double* x, double* y)        {            if(m_approximation_method == curve_inc)             {                return m_curve_inc.vertex(x, y);            }            return m_curve_div.vertex(x, y);        }    private:        curve4_inc m_curve_inc;        curve4_div m_curve_div;        curve_approximation_method_e m_approximation_method;    };}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?