C++ 通过动画输出为迷宫解算器找出最佳解决方案 摘要
我的最终目标是使用Fltk获取用户输入的像素,显示生成的迷宫(或者是我自己的,或者是从细节中提到的网站获取),然后显示动画解决方案 这就是我到目前为止所做的: 细节 我是CE学士学位的第一个c++/算法班的学生 我们一直在学习图形、dijkstra等。上个星期,在看了Computerphile关于迷宫解决的视频后,我决定尝试将理论应用到“实践”中 起初,我想从这个站点输出一个迷宫,以及绘制的解决方案。我选择墙和路径应该是1x1像素,以便更容易生成2D向量,然后生成图形 这进行得很顺利,我的程序输出了一个已解决的.png文件,使用dijkstra查找最短路径 然后我想把整个解决方案放在一个动画gif中 这也很有效。对于每个颜色为绿色/黄色的像素,它会将一个RGBA向量传递到gif库,最后我会得到一个动画的逐步解决方案 我还为每个传递到gif库的RGBA向量,首先使用以下函数将其放大:C++ 通过动画输出为迷宫解算器找出最佳解决方案 摘要,c++,gif,maze,fltk,C++,Gif,Maze,Fltk,我的最终目标是使用Fltk获取用户输入的像素,显示生成的迷宫(或者是我自己的,或者是从细节中提到的网站获取),然后显示动画解决方案 这就是我到目前为止所做的: 细节 我是CE学士学位的第一个c++/算法班的学生 我们一直在学习图形、dijkstra等。上个星期,在看了Computerphile关于迷宫解决的视频后,我决定尝试将理论应用到“实践”中 起初,我想从这个站点输出一个迷宫,以及绘制的解决方案。我选择墙和路径应该是1x1像素,以便更容易生成2D向量,然后生成图形 这进行得很顺利,我的程序
//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;
}
//缓冲区和调整大小的缓冲区都是成员变量,对于路径中的每个//打印像素,它会更新“buffer”,并在该函数中将其//放大为“resized\u buffer”
//高度和宽度为原始尺寸
//nHeight和nWidth是新的尺寸。
布尔迷宫:重采样(整数宽,整数宽)
{
if(buffer.size()==0)返回false;
调整了缓冲区的大小。清除();
对于(inti=0;i
问题
问题是,在放大它们的同时要花很长时间才能做到这一点,即使是50x50像素的“小”迷宫,在试图将它们放大到300x300像素时也是如此。我花了很多时间使代码尽可能的高效和快速,但是在我添加了伸缩性之后,过去需要10分钟的东西现在需要几个小时
在fltk中,我使用Fl_Anim_Gif-library来显示动画Gif,但它不会加载已放大的迷宫Gif(仍然对此进行故障排除)
我真正的问题
是否有可能改进缩放功能,使其不会永远持续?或者这是一个完全错误的方法
在fltk中尝试将其显示为gif是一个愚蠢的想法吗?直接在fltk中绘制会更容易吗?还是我应该尝试在fltk中一个接一个地显示图像
我只是在熟悉fltk。现在使用像Qt这样的东西会更容易吗。从长远来看,这对学习GUI库更有利吗
我这样做主要是为了学习,并开始为我毕业时建立一些投资组合。为此制作gui是有益的还是浪费时间
如果您有任何想法或意见,我们将不胜感激。无论您使用何种图形软件包,性能都将非常相似。这取决于如何处理内部构件。比如说,
无论您使用什么图形软件包,其性能都是相似的。这取决于如何处理内部构件。比如说,
什么是调整大小的缓冲区?它是矢量吗?您是否使用vector.reserve留出空间,使其不会继续分配?缓冲区的大小是多少?它是矢量吗?您是否使用vector.reserve留出空间,使其不会继续分配?