C 语言希尔伯特曲线程序

2024年8月28日 | 阅读 4 分钟

在本文中,我们将讨论 C 语言中的希尔伯特曲线程序。但在讨论程序之前,我们必须了解希尔伯特曲线

希尔伯特曲线

希尔伯特曲线是一种分形空间填充曲线,它按照预定的顺序穿过正方形中的每个点。数学家大卫·希尔伯特1891年首次引入了它。希尔伯特曲线的主要思想是通过递归地将正方形分解成更小的正方形,然后以一种创建连续曲线的方式连接这些更小的正方形。

曲线的阶

希尔伯特曲线的阶控制着生成曲线所需的递归步数。随着阶数的增加,曲线变得越来越复杂和曲折。曲线的阶通常用正整数“n”表示。

曲线的构建

希尔伯特曲线是通过递归的细分旋转来构建的。递归的每个级别都由四个更小的曲线组成,分别对应正方形的四个象限。访问这些象限的顺序经过仔细考虑,以确保曲线保持连续。

示例

下面以一个分步生成和在 C 语言中呈现希尔伯特曲线点的示例

输出

Enter the order of Hilbert Curve: 3
Points on the Hilbert Curve:
(7, 0) (6, 1) (7, 1) (7, -1) (5, 2) (4, 3) (5, 3) (5, 1) (6, 2) (5, 3) (6, 3) (6, 1) (5, -1) (6, -2) (5, -2) (5, 0) (3, 4) (2, 5) (3, 5) (3, 3) (1, 6) (0, 7) (1, 7) (1, 5) (2, 6) (1, 7) (2, 7) (2, 5) (1, 3) (2, 2) (1, 2) (1, 4) (4, 4) (3, 5) (4, 5) (4, 3) (2, 6) (1, 7) (2, 7) (2, 5) (3, 6) (2, 7) (3, 7) (3, 5) (2, 3) (3, 2) (2, 2) (2, 4) (1, -1) (2, -2) (1, -2) (1, 0) (3, -3) (4, -4) (3, -4) (3, -2) (2, -3) (3, -4) (2, -4) (2, -2) (3, 0) (2, 1) (3, 1) (3, -1)

说明

1. 头文件包含

代码首先包含必要的头文件,包括用于常用输入输出函数的“stdio.h”和用于“pow()”等数学运算的“math.h”

2. hilbertCurve 函数

此函数使用递归来生成希尔伯特曲线的点。它有几个参数:

  • n:当前递归的阶数。
  • (x,y):当前的平面位置。
  • (xi, xj):沿 x 轴正方向负方向的单位向量是(xi, xj)
  • (yi, yj):沿y 轴正方向负方向的单位向量是(yi, yj)

3. 基础情况

n减小到0时,这是递归的基础情况。此时,函数将当前位置(x, y)输出为曲线上的一个点。

4. 递归步骤

该函数对每个递归级别使用四个递归调用来表示当前正方形的四个象限。这些调用根据当前使用的象限和递归级别更新位置 (x, y)方向向量

  • 第一个递归调用表示象限 A,此时位置沿(xi, xj)方向变化。
  • 第二个递归调用表示象限 B,此时位置沿(yi, yj)方向变化。
  • 第三个递归调用表示象限 C,此时位置同时沿(xi, xj)(yi, yj)方向移动。
  • 第四个递归调用表示象限 D,此时位置沿(-xi, -xj)(-yi, -yj)方向移动。

5. main 函数

main() 函数中,用户被要求输入希尔伯特曲线的阶数 (n)

  • 曲线上的点数(numPoints)和正方形的边长(sideLength)分别使用公式pow(2, n * 2)pow(2, n)来确定。
  • 然后,使用给定的参数调用hilbertCurve 函数。生成的曲线点会打印到控制台。

在这个 C 程序中,通过递归演示了希尔伯特曲线的概念。hilbertCurve 函数根据用户指定的阶数递归地划分正方形以生成曲线上的点。该应用程序很好地展示了如何使用递归算法生成复杂的几何图案