【问题标题】:Implementing zoom on a fractal在分形上实现缩放
【发布时间】:2015-02-21 23:49:49
【问题描述】:

我使用以下算法实现了一个非常基本的 Serpiensky 三角形:

For each pixel (Px, Py)
if (Px & Py)
draw_pixel(Px, Py, color);

我想知道是否可以在其上实现缩放模拟,以通过漂亮的动画逐步且无限期地“进入”三角形。我无法理解这个公式,也没有在网络上找到任何密切相关的内容。

【问题讨论】:

    标签: c fractals


    【解决方案1】:

    您使用的算法将产生如下内容:

    可以有不同的方法来获得缩放动画效果,但基本原理始终相同。您以较快的速度逐一显示原始帧的移位和缩放版本。 在这里,我描述了一种非常简单的方法(假设我们使用N 步骤在T 秒内达到相同的状态):

    1. 计算图像像素(对于 Serpiensky 三角形)并将其存储在二维数组中。
    2. 将原始图像复制到(单独的)帧缓冲区中。
    3. 循环{
      1. 缩小坐标空间(实际上是放大帧缓冲区)
      2. 移动框架(向坐标添加小偏移量,以便移动它)
      3. 以原始分辨率显示新的帧缓冲区图像(裁剪超出帧的像素)
      4. 等待一小段时间(30fps 大约需要 33 毫秒)。
      5. 如果Nth 迭代?转到步骤 2
    4. } 转到步骤 3

    NT 的选择取决于您希望动画的速度和流畅度。必须选择偏移量和缩放因子,以便:在N 缩放和移动步骤之后,您将得到一个看起来与起始(原始)图像几乎相同的图像。

    值得一提的重要一点是,为了让这种方法产生平滑的(即看起来像下降的)动画,需要计算出的 Serpiensky 三角形的分辨率大约是显示分辨率的 20-30 倍。

    【讨论】:

    • 最初我的想法是在图像周围有效地裁剪一层像素并从那里重新绘制分形,但我对图形有点陌生,不知道该怎么做。缩小坐标空间并裁剪像素是我正在努力解决的问题。因为如果我缩小,比如说,图像周围的 1 个像素,当我重新启动算法时,要么会出现相同的结果(因为我正在循环通过相同的像素坐标),要么图像只会被裁剪 1 个像素但是不会占据整个屏幕。
    • @Willy 我将尝试用完全不同的方式来解释它:假设我们在复制到 帧缓冲区之前设置了Px" = 1.1 * Px。只有 91% 的原始图片会被复制,其余部分会被裁剪。 Px" 将是一个更大的新空间。复制完成后,我们重新调整它以显示输出分辨率。原始图像未受影响,我们所做的所有操作都在副本上,即 frame-buffer。事实上,您不需要完全按照我提到的步骤进行操作。根据您的确切目标,您的方法应该有所不同。但我认为您已经掌握了总体思路。
    • "复制完成后,我们重新缩放它以显示输出分辨率。"这是我想念的部分。你碰巧有这方面的资源吗?
    • @Willy 不确定您是否需要有关图像处理(如缩放、平滑等)的信息,或者寻找有关具有图形功能的软件/库的信息。 scantips.com/lights/resize.html 对基本图像处理进行了非常简单的介绍。但如果您正在寻找图形库,我建议您使用 OpenGL。一开始它可能看起来有点复杂,但它的结构非常好,并且是一个非常强大的图形库。阅读更多opengl.org/resources/libraries
    猜你喜欢
    • 2022-08-05
    • 2019-09-14
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2011-06-02
    • 2012-04-13
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多