歌者文明清理员 发表于 2023-1-31 08:45:24

关于希尔伯特曲线

看到B站有一位Up用希尔伯特曲线做降维打击
手痒也想试试看{:10_312:}
可是怎么把线拉直……(没错,这问题考虑了我好几天)
有人知道吗

歌者文明清理员 发表于 2024-2-6 21:51:50

小甲鱼的二师兄 发表于 2024-2-6 21:18
视频发一下链接?

https://www.bilibili.com/video/BV1Sf4y147J9/?spm_id_from=333.337.search-card.all.click

歌者文明清理员 发表于 2023-1-31 08:53:13

还有三维的希尔伯特曲线如何构造视频里没说
二维希尔伯特已经成功做出来
代码如下
import pygame

def init():
    global origin
    origin = pygame.Surface((3, 3))
    origin.fill((255, 255, 255))
    points = [
      (0, 0), (1, 0), (2, 0),
      (0, 1),         (2, 1),
      (0, 2),         (2, 2)
    ]
    for point in points:
      origin.set_at(point, (0, 0, 0))

def plot():
    newS = newW, newH = (originW * 2 + 1, originH * 2 + 1)
    w1 = newW // 2
    h1 = newH // 2
    originR90 = pygame.transform.rotate(origin, -90)
    originL90 = pygame.transform.rotate(origin, 90)
    newer = pygame.transform.scale(none, newS)
    newer.blit(origin, (0, 0))
    newer.blit(origin, (w1 + 1, 0))
    newer.blit(originR90, (0, h1 + 1))
    newer.blit(originL90, (w1 + 1, h1 + 1))
    newer.set_at((0, h1), (0, 0, 0))
    newer.set_at((w1, h1 - 1), (0, 0, 0))
    newer.set_at((newW - 1, h1), (0, 0, 0))
    return newer

def main():
    global originS, originW, originH
    global screen, origin
    pygame.init()
    screen = pygame.display.set_mode(size)
    init()
    plots =
    for i in range(6):
      origin = plot()
      originS = originW, originH = origin.get_size()
      plots.append(origin)
    plots.append(plot())
    clock = pygame.time.Clock()
    counter = 0
    running = True
    while running:
      clock.tick(1)
      screen.fill((255, 255, 255))
      screen.blit(pygame.transform.scale(plots[
            counter
      ], size), (0, 0))
      for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
      pygame.display.flip()
      counter += 1
      counter %= len(plots)
    pygame.quit()

size = width, height = (600, 600)
screen = None
origin = None
originS = originW, originH = (3, 3)
none = pygame.Surface(originS)
none.fill((255, 255, 255))

if __name__ == '__main__':
    main()

注:二维希尔伯特曲线代码随便拿去用吧,反正求助的时候代码还是要展示出来的

歌者文明清理员 发表于 2023-2-16 07:34:12

没人啊…

歌者文明清理员 发表于 2023-4-2 14:59:25

傻眼貓咪 发表于 2023-4-2 15:22:39

以前有款手机游戏名字叫【贪食蛇】
【希尔伯特曲线】应该是它的极致解法吧
{:5_109:}{:5_109:}{:5_109:}

不二如是 发表于 2024-2-6 10:19:47

{:10_256:}{:10_256:}{:10_256:}蹲答案

zhangchenyvn 发表于 2024-2-6 19:10:53

碳基生物脑子炸了,硅基生物来了:
请尝逝一下这段AI生成的代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from hilbertcurve.hilbertcurve import HilbertCurve

# 设置希尔伯特曲线的参数
p = 3# order
n = 3# dimension
hilbert_curve = HilbertCurve(p, n)

# 获取曲线上点的总数
max_distance = 2**(p * n) - 1

# 将希尔伯特曲线转为三维坐标系下的坐标点
points = []
for i in range(max_distance + 1):
    point = hilbert_curve.point_from_distance(i)
    points.append(point)

# 提取出 x, y, z 坐标
x = for p in points]
y = for p in points]
z = for p in points]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 画出希尔伯特曲线
ax.plot(x, y, z)

# 设定图形显示的角度
ax.view_init(30, 45)

# 显示图形
plt.show()

歌者文明清理员 发表于 2024-2-6 19:50:09

zhangchenyvn 发表于 2024-2-6 19:10
碳基生物脑子炸了,硅基生物来了:
请尝逝一下这段AI生成的代码:

把2#的代码也一起提问一下?

zhangchenyvn 发表于 2024-2-6 19:55:47

本帖最后由 zhangchenyvn 于 2024-2-6 20:02 编辑

GPT4-turbo对此表示无能为力。。。
在这段代码中,加入三维希尔伯特曲线的功能会相当复杂,因为需要处理三维空间中的图形旋转和投影问题。由于Pygame库是专门为二维图形设计的,且这段代码并没有提供一个直接的三维绘制环境,要实现这一功能,就需要自己实现一个三维到二维的投影算法,同时还需要设计三维希尔伯特曲线的生成算法。
一种可能的方法是,你可以为每个旋转增加额外的维度处理,然后写一个简单的3D渲染器来处理这些旋转,并将其投影到2D平面上。这将涉及到一些数学处理,比如使用矩阵变换等。
但这将是一个非常大的任务,并且远远超出了这一简单的对话交互所能处理的范围。为了真正实现这个功能,你可能需要寻找专门处理三维图形的Python库(如PyOpenGL),并做大量的数学和图形编程工作。
如果你仍然希望在现有的Pygame框架内尝试简单地模拟三维希尔伯特曲线,你可能需要查阅有关三维希尔伯特曲线的算法文献,以及关于三维图形的基础知识,然后以此为基础扩展你的代码。或者,你可以尝试创建一个“伪三维”视觉效果,通过二维模拟来创造三维效果的错觉。但请注意,这依然是一个复杂的任务,需要扎实的编程和数学技能。
我强行让他编写代码,他输出了:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def hilbert_curve(ax, center, size, level, head, up, right):
    if level == 0:
      ax.scatter(center, center, center, color='black')
    else:
      half = size / 2
      step1 = - right - head for i in range(3)]
      step2 = + right - head for i in range(3)]
      step3 = + right + head for i in range(3)]
      step4 = - right + head for i in range(3)]

      third = size / 3
      hilbert_curve(ax, - step1 * third for i in range(3)], half, level-1, up, right, head)
      hilbert_curve(ax, - step2 * third for i in range(3)], half, level-1, head, up, right)
      hilbert_curve(ax, - step3 * third for i in range(3)], half, level-1, head, up, right)
      hilbert_curve(ax, + step4 * third for i in range(3)], half, level-1, up, right, head)
      hilbert_curve(ax, + step1 * third for i in range(3)], half, level-1, up, right, head)
      hilbert_curve(ax, + step2 * third for i in range(3)], half, level-1, head, up, right)
      hilbert_curve(ax, + step3 * third for i in range(3)], half, level-1, head, up, right)
      hilbert_curve(ax, - step4 * third for i in range(3)], half, level-1, up, right, head)

# 建立图表,轴和3D Hilbert曲线
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 设置三维希尔伯特曲线的初始参数
center =
size = 100
level = 3# 曲线的递归深度
head = # 曲线朝向
up = # 曲线定义的“上”方向
right = # 曲线定义的“右”方向

# 递归生成3D Hilbert曲线
hilbert_curve(ax, center, size, level, head, up, right)

# 调整图标尺寸和角度
ax.set_xlim(-size, size)
ax.set_ylim(-size, size)
ax.set_zlim(-size, size)

# 展示图标
plt.show()

小甲鱼的二师兄 发表于 2024-2-6 21:18:29

视频发一下链接?

zhangchenyvn 发表于 2024-2-7 10:50:36

看完了视频,我差点吐了。。。

zhangchenyvn 发表于 2024-2-7 12:57:40

#!/usr/bin/env python
from manimlib.imports import *


class CurveDemo(Scene):
    """docstring for CurveDemo"""

    def construct(self):
      curve = HilbertCurve3D()
      self.play(ShowCreation(curve), run_time=20)

zhangchenyvn 发表于 2024-2-7 13:10:53

本帖最后由 zhangchenyvn 于 2024-2-7 13:19 编辑

题主,我在某帖子上,看到说这个项目在GitHub上开源了。
开源地址

食用方法:详见readme.md

小甲鱼的二师兄 发表于 2024-2-8 00:43:08

歌者文明清理员 发表于 2023-1-31 08:53
还有三维的希尔伯特曲线如何构造视频里没说
二维希尔伯特已经成功做出来
代码如下


先这样:



再这样:



关于希尔伯特曲线展开可以看下这个 -> https://www.bilibili.com/video/av4201747/?spm_id_from=333.788.video.desc.click
页: [1]
查看完整版本: 关于希尔伯特曲线