C++ 通过动画输出为迷宫解算器找出最佳解决方案 摘要

C++ 通过动画输出为迷宫解算器找出最佳解决方案 摘要,c++,gif,maze,fltk,C++,Gif,Maze,Fltk,我的最终目标是使用Fltk获取用户输入的像素,显示生成的迷宫(或者是我自己的,或者是从细节中提到的网站获取),然后显示动画解决方案 这就是我到目前为止所做的: 细节 我是CE学士学位的第一个c++/算法班的学生 我们一直在学习图形、dijkstra等。上个星期,在看了Computerphile关于迷宫解决的视频后,我决定尝试将理论应用到“实践”中 起初,我想从这个站点输出一个迷宫,以及绘制的解决方案。我选择墙和路径应该是1x1像素,以便更容易生成2D向量,然后生成图形 这进行得很顺利,我的程序

我的最终目标是使用Fltk获取用户输入的像素,显示生成的迷宫(或者是我自己的,或者是从细节中提到的网站获取),然后显示动画解决方案

这就是我到目前为止所做的:

细节 我是CE学士学位的第一个c++/算法班的学生

我们一直在学习图形、dijkstra等。上个星期,在看了Computerphile关于迷宫解决的视频后,我决定尝试将理论应用到“实践”中

起初,我想从这个站点输出一个迷宫,以及绘制的解决方案。我选择墙和路径应该是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;
}
//缓冲区和调整大小的缓冲区都是成员变量,对于路径中的每个//打印像素,它会更新“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是有益的还是浪费时间


如果您有任何想法或意见,我们将不胜感激。

无论您使用何种图形软件包,性能都将非常相似。这取决于如何处理内部构件。比如说,

  • 如果您将其写入缓冲区并将其BLT到屏幕,则比直接写入屏幕要快
  • 如果仅在绘制事件上执行BLT,则比每次屏幕数据更改时强制和更新要快
  • 如果预先分配了缓冲区,则系统不必在缓冲区空间用完时继续重新分配
  • 假设空间已预分配,则无需先清除即可写入。它将要写入的每个单元格,因此无需清除、分配和重新分配

  • 无论您使用什么图形软件包,其性能都是相似的。这取决于如何处理内部构件。比如说,

  • 如果您将其写入缓冲区并将其BLT到屏幕,则比直接写入屏幕要快
  • 如果仅在绘制事件上执行BLT,则比每次屏幕数据更改时强制和更新要快
  • 如果预先分配了缓冲区,则系统不必在缓冲区空间用完时继续重新分配
  • 假设空间已预分配,则无需先清除即可写入。它将要写入的每个单元格,因此无需清除、分配和重新分配

  • 什么是调整大小的缓冲区?它是矢量吗?您是否使用vector.reserve留出空间,使其不会继续分配?缓冲区的大小是多少?它是矢量吗?您是否使用vector.reserve留出空间,使其不会继续分配?