我想使用Visual C ++为屏幕填充路径设置动画。我以前用C#做过,但现在切换到C ++以获得更好的性能,并且希望将来能够做更强大的工作。
以下是C#中的概念:
在Canvas
我有一些Path
。这些路径是LineTo
和QuadraticBezierTo
函数组合的闭合几何。
LinearGradientBrush
来实现,然后通过计时器将偏移量从0增加到1。 我想在Visual C ++中做同样的事情。我需要知道一种有效的方法:
所以,我需要的是:
LineTo
和QuadraticBezierTo
函数相同的函数连接的点组合。您能否建议一种方法来完成上述步骤? (概述我要阅读的内容,然后我可以自己研究)。我知道基本的Visual C ++,Win32 GUI和一些关于绘图上下文(HDC)和GDI,但只是开始学习图形/绘图。
抱歉我的英文!如果我解释的任何事情都不清楚,请告诉我。
答案 0 :(得分:1)
quite lot of point
有多少?什么是目标帧率?对于足够低的计数,您可以使用 GDI ,否则您需要像 OpenGL,DirectX 这样的硬件加速。
我假设2D所以你需要:
将您的路径存储为细分列表
例如:
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
}
使用backbuffer加速
使用color1渲染整个路径到某个位图。在每个动画步骤中,只渲染新添加的color1内容。在每次重绘时,只需将位图复制到屏幕上,而不是一遍又一遍地渲染相同的几何图形。如果您具有缩放/平移/调整大小功能,则需要在每次更改时完全重绘位图...