[C++/easyx]希尔伯特曲线的指定点输出及其完整可视化 您所在的位置:网站首页 12点的指针怎么画 [C++/easyx]希尔伯特曲线的指定点输出及其完整可视化

[C++/easyx]希尔伯特曲线的指定点输出及其完整可视化

#[C++/easyx]希尔伯特曲线的指定点输出及其完整可视化| 来源: 网络整理| 查看: 265

两个问题: 1.如何输出希尔伯特曲线的指定经过的第p个点坐标? 2.如何绘制出整个n阶的希尔伯特曲线(即可视化输出)?

首先,我们来说明下什么是希尔伯特曲线。 什么是希尔伯特曲线,我借用这张截图一用即可说明: 在这里插入图片描述 我们规定左下角方格的坐标为(0,0),右下角方格的坐标为(2的n次方-1,0)。

注意,以下n均指n阶希尔伯特曲线,p均指第p个点。

那么我们来解决第一个问题:如何输出希尔伯特曲线的指定经过的第p个点坐标?

首先我们观察这些曲线的特点,可以看见,如果把整体分成四大均匀块,那么整体来讲,一个希尔伯特图的坐标变化是++y,++x,- -y 在这里插入图片描述 然后我们以二阶曲线为例子(因为一阶曲线的局部是个点,所以换个二阶来看,但无论多少阶都不会影响最终结论) 在这里插入图片描述 观察局部的规律: 头部两个图依然是相对是(++y,++x,- -y)这样的。(为什么说相对?之后会有解释) 在这里插入图片描述

左下角是单个部分图向右旋转90°的形象,其坐标这时有了不同的变化,是(++x,++y,- -x) 在这里插入图片描述

右下角是单个部分图向左旋转90°的形象,其坐标这时也有了不同的变化,是(- -x, - -y,++x) 在这里插入图片描述

我们可以发现,左下角和右下角在相对位置上面存在xy置换现象,(如左下角,它把++y,++x,- -y变成了++x,++y,- -x)且右下角不仅存在xy置换现象,而且xy的增减是相反的。

总结以上,我们知道这条规律:相对的,对于整个图来说,它可以分为四大部分的图,每个部分图又可以看做为一个整体的图,继而递归下去,直至一阶图,而且无论几阶图的点的坐标走向都是++y,++x,- -y,但由于部分图存在旋转,所以在递归的时候xy会有置换。

这条规律将导致在递归过程中,xy的意义会时不时互换,因此,我们说xy都是相对意义上的xy

我们可以先准备这样一个递归函数,它将把一个n阶的希尔伯特曲线图当做一阶的来处理,只进行相对意义上的(++y,++x,- -y)操作。而在进行这三个自增自减的坐标变动操作之前,我们会把它的四分之一图(低一阶的希尔伯特曲线),从左下到左上,从左上到右上,从右上到右下的依次递归处理,直至我们遇到一阶的希尔伯特曲线。

函数声明如下

void line(int n, int *x, int *y, int face);

n代表当前是几阶希尔伯特曲线 x是相对意义的x y是相对意义的y face则是代表在这个相对的希尔伯特图下,x和y的值到底是该增还是该减

然后我们搭建出如下的一个代码框架

#include using namespace std; int x = 0, y = 0; long long p; void line(int n, int *x, int *y, int face) { ... } int main() { int n; cin >> n >> p; line(n, &x, &y, 1); return 0; }

p和x,y作为全局变量是有好处的,由于他们不需要回溯他们的值,所以放在外面当全局变量,可以不用每次执行递归函数都创建出他们三个临时变量。

然后他们的作用是显而易见的: p代表当前离目标经过点还剩几步 x,y代表当前点坐标 n代表在当前递归函数处理的希尔伯特图是几阶的

该函数内部我们这么写就能处理掉当前阶的希尔伯特曲线的坐标移动问题:

void line(int n, int *x, int *y, int face) { *y += face;//相对地,y应做自增处理 *x += face;//相对地,x应做自增处理 *y -= face;//相对地,y应做自减处理 }

然后我们知道这只是抽象地将n阶的希尔伯特曲线看作是一个拥有四大部分的一阶希尔伯特曲线, 所以我们需要对每个四分之一的n-1阶希尔伯特曲线做具体的递归处理,即:

void line(int n, int *x, int *y, int face) { if (n cout cout cout cout if (n


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有