抽象
我的最终目标是使用 Fltk 获取用户输入的像素,显示生成的迷宫(我自己的迷宫,或者从详细信息中提到的网站获取),然后显示动画解决方案。
这是我到目前为止所管理的: https://giant.gfycat.com/VioletWelloffHatchetfish.webm
详
我正在上CE学士学位的第一堂C ++/算法课。
由于我们一直在学习图形,dijkstra等,在过去的几周里,在观看了Computerphile关于迷宫求解的视频后,我决定尝试将理论付诸"实践"。
起初,我想从这个站点输出一个迷宫,http://hereandabove.com/maze/mazeorig.form.html,带有绘制的解决方案。我选择墙壁和路径应该是 1x1 像素,以便更容易制作成 2D 矢量,然后是图形。
这很顺利,我的程序输出了一个已解决的.png文件,使用 dijkstra 找到最短路径。
然后我想把整个解决方案放在一个动画 gif 中。
这也很好用。对于每个像素,它的颜色为绿色/黄色,它将RGBA矢量传递给gif库,最后我最终得到了一个动画的分步解决方案。
我还对于传递给 gif 库的每个 RGBA 向量,首先使用这个函数放大它:
//Both the buffer and resized buffer are member variables, and for each //plotted pixel in the path it updates 'buffer', and in this function makes a //larger version of it to 'resized_buffer'
// HEIGHT and WIDTH are the original size
// nHeight and nWidth are the new size.
bool Maze_IMG::resample(int nWidth, int nHeight)
{
if (buffer.size() == 0) return false;
resized_buffer.clear();
for (int i = 0; i < nWidth * nHeight * 4; i++) resized_buffer.push_back(-1);
double scaleWidth = (double)nWidth / (double)WIDTH;
double scaleHeight = (double)nHeight / (double)HEIGHT;
for (int cy = 0; cy < nHeight; cy++)
{
for (int cx = 0; cx < nWidth; cx++)
{
int pixel = (cy * (nWidth * 4)) + (cx * 4);
int nearestMatch = (((int)(cy / scaleHeight) * (WIDTH * 4)) + ((int)(cx / scaleWidth) * 4));
resized_buffer[pixel] = buffer[nearestMatch];
resized_buffer[pixel + 1] = buffer[nearestMatch + 1];
resized_buffer[pixel + 2] = buffer[nearestMatch + 2];
resized_buffer[pixel + 3] = buffer[nearestMatch + 3];
}
}
return true;
}
问题
问题在于,在尝试将它们缩放到 300x300 时,即使使用像素为 50x50 像素的"小"迷宫,也需要很长时间才能做到这一点。我花了很多时间来使代码尽可能高效和快速,但是在我添加缩放之后,过去需要 10 分钟的东西现在需要几个小时。
在 fltk 中,我使用 Fl_Anim_Gif 库来显示动画 gif,但它不会加载已放大的迷宫 gif(仍在对此进行故障排除)。
我真正的问题
是否可以改进缩放功能,使其不会永远花费?或者这是一种完全错误的方法?
尝试在 fltk 中将其显示为 gif 是一个愚蠢的想法,直接在 fltk 中绘制它会更容易,还是我应该尝试一个接一个地显示图像?
我只是在熟悉 fltk。现在使用像Qt这样的东西会更容易吗?从长远来看,就学习 GUI 库而言,这会更有益吗?
我这样做主要是为了学习,并在毕业时开始建立某种投资组合。为此制作一个 gui 是有益的,还是浪费时间?
任何想法或意见将不胜感激。
无论您使用哪种图形包,性能都将相似。 这取决于您如何处理内部结构。 例如
- 如果将其写入缓冲区并将其 BLT 写入屏幕,则比直接写入屏幕更快。
- 如果只对绘制事件进行 BLT,则比每次屏幕数据更改时强制和更新要快。
- 如果预分配缓冲区,则系统不必在缓冲区空间用完时继续重新分配。
- 假设空间是预先分配的,则可以在不先清除的情况下写入它。 它将被写入的每个单元格,因此无需清除,分配和重新分配。