⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agg_path_storage.h

📁 这是VCF框架的代码
💻 H
📖 第 1 页 / 共 4 页
字号:
                if(is_vertex(cmd))                {                    double x0, y0;                    unsigned cmd0 = last_vertex(&x0, &y0);                    if(is_vertex(cmd0))                    {                        if(calc_distance(x, y, x0, y0) > vertex_dist_epsilon)                        {                            if(is_move_to(cmd)) cmd = path_cmd_line_to;                            m_vertices.add_vertex(x, y, cmd);                        }                    }                    else                    {                        if(is_stop(cmd0))                        {                            cmd = path_cmd_move_to;                        }                        else                        {                            if(is_move_to(cmd)) cmd = path_cmd_line_to;                        }                        m_vertices.add_vertex(x, y, cmd);                    }                }                while(!is_stop(cmd = vs.vertex(&x, &y)))                {                    m_vertices.add_vertex(x, y, is_move_to(cmd) ?                                                     path_cmd_line_to :                                                     cmd);                }            }        }        // Concatenate polygon/polyline.         //--------------------------------------------------------------------        template<class T> void concat_poly(const T* data,                                            unsigned num_points,                                           bool closed)        {            poly_plain_adaptor<T> poly(data, num_points, closed);            concat_path(poly);        }        // Join polygon/polyline continuously.        //--------------------------------------------------------------------        template<class T> void join_poly(const T* data,                                          unsigned num_points,                                         bool closed)        {            poly_plain_adaptor<T> poly(data, num_points, closed);            join_path(poly);        }    private:        unsigned perceive_polygon_orientation(unsigned start, unsigned end);        void     invert_polygon(unsigned start, unsigned end);        VertexContainer m_vertices;        unsigned        m_iterator;    };    //------------------------------------------------------------------------    template<class VC>     unsigned path_base<VC>::start_new_path()    {        if(!is_stop(m_vertices.last_command()))        {            m_vertices.add_vertex(0.0, 0.0, path_cmd_stop);        }        return m_vertices.total_vertices();    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::rel_to_abs(double* x, double* y) const    {        if(m_vertices.total_vertices())        {            double x2;            double y2;            if(is_vertex(m_vertices.last_vertex(&x2, &y2)))            {                *x += x2;                *y += y2;            }        }    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::move_to(double x, double y)    {        m_vertices.add_vertex(x, y, path_cmd_move_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::move_rel(double dx, double dy)    {        rel_to_abs(&dx, &dy);        m_vertices.add_vertex(dx, dy, path_cmd_move_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::line_to(double x, double y)    {        m_vertices.add_vertex(x, y, path_cmd_line_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::line_rel(double dx, double dy)    {        rel_to_abs(&dx, &dy);        m_vertices.add_vertex(dx, dy, path_cmd_line_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::hline_to(double x)    {        m_vertices.add_vertex(x, last_y(), path_cmd_line_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::hline_rel(double dx)    {        double dy = 0;        rel_to_abs(&dx, &dy);        m_vertices.add_vertex(dx, dy, path_cmd_line_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::vline_to(double y)    {        m_vertices.add_vertex(last_x(), y, path_cmd_line_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::vline_rel(double dy)    {        double dx = 0;        rel_to_abs(&dx, &dy);        m_vertices.add_vertex(dx, dy, path_cmd_line_to);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::arc_to(double rx, double ry,                               double angle,                               bool large_arc_flag,                               bool sweep_flag,                               double x, double y)    {        if(m_vertices.total_vertices() && is_vertex(m_vertices.last_command()))        {            const double epsilon = 1e-30;            double x0 = 0.0;            double y0 = 0.0;            m_vertices.last_vertex(&x0, &y0);            rx = fabs(rx);            ry = fabs(ry);            // Ensure radii are valid            //-------------------------            if(rx < epsilon || ry < epsilon)             {                line_to(x, y);                return;            }            if(calc_distance(x0, y0, x, y) < epsilon)            {                // If the endpoints (x, y) and (x0, y0) are identical, then this                // is equivalent to omitting the elliptical arc segment entirely.                return;            }            bezier_arc_svg a(x0, y0, rx, ry, angle, large_arc_flag, sweep_flag, x, y);            if(a.radii_ok())            {                join_path(a);            }            else            {                line_to(x, y);            }        }        else        {            move_to(x, y);        }    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::arc_rel(double rx, double ry,                                double angle,                                bool large_arc_flag,                                bool sweep_flag,                                double dx, double dy)    {        rel_to_abs(&dx, &dy);        arc_to(rx, ry, angle, large_arc_flag, sweep_flag, dx, dy);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve3(double x_ctrl, double y_ctrl,                                double x_to,   double y_to)    {        m_vertices.add_vertex(x_ctrl, y_ctrl, path_cmd_curve3);        m_vertices.add_vertex(x_to,   y_to,   path_cmd_curve3);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve3_rel(double dx_ctrl, double dy_ctrl,                                    double dx_to,   double dy_to)    {        rel_to_abs(&dx_ctrl, &dy_ctrl);        rel_to_abs(&dx_to,   &dy_to);        m_vertices.add_vertex(dx_ctrl, dy_ctrl, path_cmd_curve3);        m_vertices.add_vertex(dx_to,   dy_to,   path_cmd_curve3);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve3(double x_to, double y_to)    {        double x0;        double y0;        if(is_vertex(m_vertices.last_vertex(&x0, &y0)))        {            double x_ctrl;            double y_ctrl;             unsigned cmd = m_vertices.prev_vertex(&x_ctrl, &y_ctrl);            if(is_curve(cmd))            {                x_ctrl = x0 + x0 - x_ctrl;                y_ctrl = y0 + y0 - y_ctrl;            }            else            {                x_ctrl = x0;                y_ctrl = y0;            }            curve3(x_ctrl, y_ctrl, x_to, y_to);        }    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve3_rel(double dx_to, double dy_to)    {        rel_to_abs(&dx_to, &dy_to);        curve3(dx_to, dy_to);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve4(double x_ctrl1, double y_ctrl1,                                double x_ctrl2, double y_ctrl2,                                double x_to,    double y_to)    {        m_vertices.add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);        m_vertices.add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);        m_vertices.add_vertex(x_to,    y_to,    path_cmd_curve4);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve4_rel(double dx_ctrl1, double dy_ctrl1,                                    double dx_ctrl2, double dy_ctrl2,                                    double dx_to,    double dy_to)    {        rel_to_abs(&dx_ctrl1, &dy_ctrl1);        rel_to_abs(&dx_ctrl2, &dy_ctrl2);        rel_to_abs(&dx_to,    &dy_to);        m_vertices.add_vertex(dx_ctrl1, dy_ctrl1, path_cmd_curve4);        m_vertices.add_vertex(dx_ctrl2, dy_ctrl2, path_cmd_curve4);        m_vertices.add_vertex(dx_to,    dy_to,    path_cmd_curve4);    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve4(double x_ctrl2, double y_ctrl2,                                double x_to,    double y_to)    {        double x0;        double y0;        if(is_vertex(last_vertex(&x0, &y0)))        {            double x_ctrl1;            double y_ctrl1;             unsigned cmd = prev_vertex(&x_ctrl1, &y_ctrl1);            if(is_curve(cmd))            {                x_ctrl1 = x0 + x0 - x_ctrl1;                y_ctrl1 = y0 + y0 - y_ctrl1;            }            else            {                x_ctrl1 = x0;                y_ctrl1 = y0;            }            curve4(x_ctrl1, y_ctrl1, x_ctrl2, y_ctrl2, x_to, y_to);        }    }    //------------------------------------------------------------------------    template<class VC>     void path_base<VC>::curve4_rel(double dx_ctrl2, double dy_ctrl2,                                    double dx_to,    double dy_to)    {        rel_to_abs(&dx_ctrl2, &dy_ctrl2);        rel_to_abs(&dx_to,    &dy_to);        curve4(dx_ctrl2, dy_ctrl2, dx_to, dy_to);    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::end_poly(unsigned flags)    {        if(is_vertex(m_vertices.last_command()))        {            m_vertices.add_vertex(0.0, 0.0, path_cmd_end_poly | flags);        }    }    //------------------------------------------------------------------------    template<class VC>     inline void path_base<VC>::close_polygon(unsigned flags)    {        end_poly(path_flags_close | flags);    }    //------------------------------------------------------------------------    template<class VC>     inline unsigned path_base<VC>::total_vertices() const    {        return m_vertices.total_vertices();    }    //------------------------------------------------------------------------    template<class VC>     inline unsigned path_base<VC>::last_vertex(double* x, double* y) const    {        return m_vertices.last_vertex(x, y);    }    //------------------------------------------------------------------------    template<class VC>     inline unsigned path_base<VC>::prev_vertex(double* x, double* y) const    {        return m_vertices.prev_vertex(x, y);    }    //------------------------------------------------------------------------    template<class VC>     inline double path_base<VC>::last_x() const    {        return m_vertices.last_x();

⌨️ 快捷键说明

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