Visual C ++:绘制和动画填充路径到屏幕的好方法?

时间:2016-02-07 10:00:39

标签: winapi animation geometry fill graphic

我想使用Visual C ++为屏幕填充路径设置动画。我以前用C#做过,但现在切换到C ++以获得更好的性能,并且希望将来能够做更强大的工作。

以下是C#中的概念:

Canvas我有一些Path。这些路径是LineToQuadraticBezierTo函数组合的闭合几何。

  1. 首先,我为所有路径填充银色。
  2. 然后对于每条路径,我从一端到另一端(上/下/左/右方向)填充绿色(想象一个进度条将其值从min增加到max)。我通过将路径的填充画笔设置为具有相同偏移的两种颜色绿色和银色的LinearGradientBrush来实现,然后通过计时器将偏移量从0增加到1。
  3. 当路径为绿色时,继续下一个路径。
  4. 当所有路径都填满绿色时,请先退一步。
  5. 我想在Visual C ++中做同样的事情。我需要知道一种有效的方法:

    1. 在集合中创建和存储路径以重复使用。因为路径非常重要,所以重复使用它们会占用大量的CPU。
    2. 绘制窗口的所有路径。
    3. 动画填充如上述概念中的步骤2,3,4。
    4. 所以,我需要的是:

      • 创建和存储封闭路径的合适方法。注意:路径是由与C#LineToQuadraticBezierTo函数相同的函数连接的点组合。
      • 绘制和动画填充屏幕的路径。

      您能否建议一种方法来完成上述步骤? (概述我要阅读的内容,然后我可以自己研究)。我知道基本的Visual C ++,Win32 GUI和一些关于绘图上下文(HDC)和GDI,但只是开始学习图形/绘图。

      抱歉我的英文!如果我解释的任何事情都不清楚,请告诉我。

1 个答案:

答案 0 :(得分:1)

quite lot of point有多少?什么是目标帧率?对于足够低的计数,您可以使用 GDI ,否则您需要像 OpenGL,DirectX 这样的硬件加速。

我假设2D所以你需要:

  1. 将您的路径存储为细分列表

    例如:

    struct path_segment
     {
     int p0[2],p1[2],p2[2]; // points
     int type; // line/bezier
     float length; // length in pixels or whatever
     };
    const int MAX=1024;     // max number of segments
    path_segment path[MAX]; // list of segments can use any template like List<path_segment> path; instead
    int paths=0; // actual number of segments;
    float length=0.0; // while path length in pixels or whatever
    
  2. 编写要加载和呈现path[]

    的函数

    渲染只是用于目视检查,如果你加载是好的...现在至少

  3. 重写渲染

    它将float t=<0,1>作为输入参数,它将使用一种颜色呈现t下方的路径,而将其余颜色呈现为其他颜色。像这样的东西:

    int i;
    float l=0.0,q,l0=t*length; // separation length;
    for (i=0;i<paths;i++)
     {
     q=l+path[i].length;
     if (q>=l0)
      {
      // split/render path[i] to  <   0,l-l0> with color1
      // split/render path[i] to  <l-l0,q-l0> with color2
      // if you need split parameter in <0,1> then =(l-l0)/path[i].length;
      i++; break;
      }
     else
      {
      //render path[i] with color1
      }
     l=q;
     }
    for (;i<paths;i++)
     {
     //render path[i] with color2
     }
    
  4. 使用backbuffer加速

    使用color1渲染整个路径到某个位图。在每个动画步骤中,只渲染新添加的color1内容。在每次重绘时,只需将位图复制到屏幕上,而不是一遍又一遍地渲染相同的几何图形。如果您具有缩放/平移/调整大小功能,则需要在每次更改时完全重绘位图...