找出迷宫求解器的最佳解决方案,并具有动画输出



抽象

我的最终目标是使用 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 是有益的,还是浪费时间?

任何想法或意见将不胜感激。

无论您使用哪种图形包,性能都将相似。 这取决于您如何处理内部结构。 例如

  1. 如果将其写入缓冲区并将其 BLT 写入屏幕,则比直接写入屏幕更快。
  2. 如果只对绘制事件进行 BLT,则比每次屏幕数据更改时强制和更新要快。
  3. 如果预分配缓冲区,则系统不必在缓冲区空间用完时继续重新分配。
  4. 假设空间是预先分配的,则可以在不先清除的情况下写入它。 它将被写入的每个单元格,因此无需清除,分配和重新分配。

最新更新