• 轨迹的完整定义


    写成这样了...

    typedef enum LocusType
    {
        LT_LINEAR 
    = 0,
        LT_B_SPLINE,
        LT_STEP,
    }
    LocusType;

    class LocusBase
    {
    public:
        
    int m_time;
    protected:
        LocusBase(LocusType type);
        
    const LocusType mc_type;
        
    }
    ;

    template
    < class Point >
    class Locus : public LocusBase// 轨迹
    {
    public:
        Locus(LocusType type);
        
    struct Node
        
    {
            Node():m_time(
    0), m_p()
            
    {
            }

            Node(
    const Node &n):m_time(n.m_time), m_p(n.m_p)
            
    {
            }

            Node(
    int time, Point &p):m_time(time), m_p(p)
            
    {
            }

            
    int m_time;
            Point m_p;
            
    bool operator < (int time) const
            
    {
                
    return m_time < time;
            }

        }
    ;
        
    void loadData(const char *data);
        
    virtual int getInterval(int time, Point &result) = 0;
        ::std::vector
    < Node > m_data;
    }
    ;

    /// LocusLinear 
    /// @note 线性插值轨迹

    template< class Point >
    class LocusLinear : public Locus< Point > 
    {
    public:
        LocusLinear();
        
    int getInterval(int time, Point &result);
    }
    ;

    /// LocusBspline
    /// @note B样条曲线插值轨迹

    template< class Point >
    class LocusBspline : public Locus< Point > 
    {
    public:
        LocusBspline();
        
    int getInterval(int time, Point &result);
    }
    ;

    /// LocusStep
    /// @note 位置直接跳变的轨迹
    template< class Point >
    class LocusStep : public Locus< Point > 
    {
    public:
        LocusStep();
        
    int getInterval(int time, Point &result);
    }
    ;

    效果:
    https://files.cnblogs.com/kaikai/locus.rar

    数据随机生成:
        srand(timeGetTime());
        Clip clip;
        LocusBspline2d locus;
        LocusLinear2d locusZoom;
        LocusLinear1d locusRot;
        clip.pFace 
    = &ims;
        
    struct DATA{
            
    int time;
            
    int type;
            
    int size;
            Locus2d::Node node[LOCUS_MAX_NODE_COUNT];
        }
     data, zoom;
        data.time 
    = 1000;
        data.type 
    = LT_B_SPLINE,
        data.size 
    = 10;
        zoom.time 
    = 1000;
        zoom.type 
    = LT_LINEAR,
        zoom.size 
    = 10;
        
    struct DATA2{
            
    int time;
            
    int type;
            
    int size;
            Locus1d::Node node[LOCUS_MAX_NODE_COUNT];
        }
     rot;
        rot.time 
    = 1000;
        rot.type 
    = LT_LINEAR,
        rot.size 
    = 10;
        
    for (i = 0; i<10; i++)
        
    {
            data.node[i] 
    = Locus2d::Node(i*100, Point2d(rand()%640,rand()%480));
            zoom.node[i] 
    = Locus2d::Node(i*100, Point2d(rand()%100/50.f,rand()%100/50.f));
            rot.node[i].m_time 
    = i*100;
            rot.node[i].m_p 
    = rand()%360;
        }

        locus.loadData((
    const char *)&data);
        locusZoom.loadData((
    const char *)&zoom);
        locusRot.loadData((
    const char *)&rot);
        Anim ani(clip, 
    &locus, &locusZoom, &locusRot);
  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1044:判断是否为两位数
    1043:整数大小比较
    1043:整数大小比较
    1043:整数大小比较
    排序算法 —— 插入排序
    排序算法 —— 插入排序
    排序算法 —— 插入排序
    C#中如何获取一个字体的宽度值(像素单位)
    visual studio 恢复默认界面
    visual studio 恢复默认界面
  • 原文地址:https://www.cnblogs.com/kaikai/p/74132.html
Copyright © 2020-2023  润新知