Visual C++:绘制和动画填充路径到屏幕的好方法?
Visual C++: Good way to draw and animated fill path to screen?
我想使用 Visual C++ 为屏幕填充路径设置动画。我以前用 C# 做过,但现在切换到 C++ 以获得 更好的性能,并希望将来做 更复杂的工作。
这是C#中的概念:
在一个Canvas
中我有多个Path
。这些路径是 LineTo
和 QuadraticBezierTo
函数的封闭几何组合。
- 首先,我为所有路径填充银色。
- 然后对于每条路径,我从一端到另一端(up/down/left/right 方向)填充绿色(想象一个进度条将其值从最小值增加到最大值)。我通过将路径的填充笔刷设置为具有相同偏移量的绿色和银色两种颜色的
LinearGradientBrush
,然后通过计时器将偏移量从 0 增加到 1。
- 当一条路径完全变绿时,继续下一条路径。
- 当所有路径都被绿色填充后,返回第一步。
我想在 Visual C++ 中做同样的事情。我需要知道一个有效的方法:
- 创建路径并将其存储在集合中以供重复使用。因为路径比较多,重复重新创建它们需要很多CPU用法。
- 将所有路径绘制到 window。
- 按照上述概念中的步骤 2、3、4 进行动画填充。
所以,我需要的是:
- 一种创建和存储闭合路径的合适方法。注意:路径是通过与 C#
LineTo
和 QuadraticBezierTo
函数相同的函数连接的点的组合。
- 绘制并动画填充到屏幕的路径。
你能推荐一种方法来完成上述步骤吗? (概述我必须阅读的内容,然后我可以自己研究)。我了解 Visual C++、Win32 GUI 的基础知识以及一些绘图上下文 (HDC) 和 GDI,但才刚刚开始学习 Graphic/Drawing。
对不起我的英语!如果我解释的不清楚,请告诉我。
quite lot of point
是多少?什么是目标帧率?对于足够低的计数你可以使用 GDI 否则你需要像 OpenGL,DirectX.
这样的硬件加速
我假设是二维的,所以你需要:
将您的路径存储为段列表
例如像这样:
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
编写加载和渲染函数path[]
渲染只是为了目视检查加载是否正常...目前至少
重写渲染所以
它以 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
}
使用后台缓冲区进行加速
所以将带有 color1 的整个路径渲染到某个位图。在每个动画步骤中,只渲染新添加的 color1 内容。在每次重绘时,只需将位图复制到屏幕上,而不是一遍又一遍地渲染相同的几何图形。当然,如果你有 zoom/pan/resize 能力,你需要在每一个变化上完全重绘位图...
我想使用 Visual C++ 为屏幕填充路径设置动画。我以前用 C# 做过,但现在切换到 C++ 以获得 更好的性能,并希望将来做 更复杂的工作。
这是C#中的概念:
在一个Canvas
中我有多个Path
。这些路径是 LineTo
和 QuadraticBezierTo
函数的封闭几何组合。
- 首先,我为所有路径填充银色。
- 然后对于每条路径,我从一端到另一端(up/down/left/right 方向)填充绿色(想象一个进度条将其值从最小值增加到最大值)。我通过将路径的填充笔刷设置为具有相同偏移量的绿色和银色两种颜色的
LinearGradientBrush
,然后通过计时器将偏移量从 0 增加到 1。 - 当一条路径完全变绿时,继续下一条路径。
- 当所有路径都被绿色填充后,返回第一步。
我想在 Visual C++ 中做同样的事情。我需要知道一个有效的方法:
- 创建路径并将其存储在集合中以供重复使用。因为路径比较多,重复重新创建它们需要很多CPU用法。
- 将所有路径绘制到 window。
- 按照上述概念中的步骤 2、3、4 进行动画填充。
所以,我需要的是:
- 一种创建和存储闭合路径的合适方法。注意:路径是通过与 C#
LineTo
和QuadraticBezierTo
函数相同的函数连接的点的组合。 - 绘制并动画填充到屏幕的路径。
你能推荐一种方法来完成上述步骤吗? (概述我必须阅读的内容,然后我可以自己研究)。我了解 Visual C++、Win32 GUI 的基础知识以及一些绘图上下文 (HDC) 和 GDI,但才刚刚开始学习 Graphic/Drawing。
对不起我的英语!如果我解释的不清楚,请告诉我。
quite lot of point
是多少?什么是目标帧率?对于足够低的计数你可以使用 GDI 否则你需要像 OpenGL,DirectX.
我假设是二维的,所以你需要:
将您的路径存储为段列表
例如像这样:
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
编写加载和渲染函数
path[]
渲染只是为了目视检查加载是否正常...目前至少
重写渲染所以
它以
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 }
使用后台缓冲区进行加速
所以将带有 color1 的整个路径渲染到某个位图。在每个动画步骤中,只渲染新添加的 color1 内容。在每次重绘时,只需将位图复制到屏幕上,而不是一遍又一遍地渲染相同的几何图形。当然,如果你有 zoom/pan/resize 能力,你需要在每一个变化上完全重绘位图...