混沌分形之谢尔宾斯基(Sierpinski)

article/2025/8/29 17:38:42

本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形。

(1)谢尔宾斯基三角形

给三角形的3个顶点,和一个当前点,然后以以下的方式进行迭代处理:

a.随机选择三角形的某一个顶点,计算出它与当前点的中点位置;

b.将计算出的中点做为当前点,再重新执行操作a

相关代码如下:

class SierpinskiTriangle : public FractalEquation
{
public:SierpinskiTriangle(){m_StartX = 0.0f;m_StartY = 0.0f;m_StartZ = 0.0f;m_triangleX[0] = 0.0f;m_triangleY[0] = FRACTAL_RADIUS;m_triangleX[1] = FRACTAL_RADIUS*sinf(PI/3);m_triangleY[1] = -FRACTAL_RADIUS*sinf(PI/6);m_triangleX[2] = -m_triangleX[1];m_triangleY[2] = m_triangleY[1];}void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const{int r = rand()%3;outX = (x + m_triangleX[r])*0.5f;outY = (y + m_triangleY[r])*0.5f;outZ = z;}private:float m_triangleX[3];float m_triangleY[3];
};

关于基类FractalEquation的定义见:混沌与分形

最终生成的图形为:

通过这一算法可以生成如下图像:

(2)谢尔宾斯基矩形

既然能生成三角形的图形,那么对于矩形会如何呢?尝试下吧:

class SierpinskiRectangle : public FractalEquation
{
public:SierpinskiRectangle(){m_StartX = 0.0f;m_StartY = 0.0f;m_StartZ = 0.0f;m_ParamA = 1.0f;m_ParamB = 1.0f;m_rectX[0] = FRACTAL_RADIUS;m_rectY[0] = FRACTAL_RADIUS;m_rectX[1] = FRACTAL_RADIUS;m_rectY[1] = -FRACTAL_RADIUS;m_rectX[2] = -FRACTAL_RADIUS;m_rectY[2] = -FRACTAL_RADIUS;m_rectX[3] = -FRACTAL_RADIUS;m_rectY[3] = FRACTAL_RADIUS;}void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const{int r = rand()%4;outX = (x + m_rectX[r])*0.5f;outY = (y + m_rectY[r])*0.5f;outZ = z;}bool IsValidParamA() const {return true;}bool IsValidParamB() const {return true;}void SetParamA(float v){m_ParamA = v;m_rectX[0] = FRACTAL_RADIUS*m_ParamA;m_rectX[1] = FRACTAL_RADIUS*m_ParamA;m_rectX[2] = -FRACTAL_RADIUS*m_ParamA;m_rectX[3] = -FRACTAL_RADIUS*m_ParamA;}void SetParamB(float v){m_ParamB = v;m_rectY[0] = FRACTAL_RADIUS*m_ParamB;m_rectY[1] = -FRACTAL_RADIUS*m_ParamB;m_rectY[2] = -FRACTAL_RADIUS*m_ParamB;m_rectY[3] = FRACTAL_RADIUS*m_ParamB;}private:float m_rectX[4];float m_rectY[4];
};

图形如下:

噢,SHIT,毫无规律可言。

那就变动一下吧:

class FractalSquare : public FractalEquation
{
public:FractalSquare(){m_StartX = 0.0f;m_StartY = 0.0f;m_StartZ = 0.0f;m_rectX[0] = FRACTAL_RADIUS;m_rectY[0] = FRACTAL_RADIUS;m_rectX[1] = FRACTAL_RADIUS;m_rectY[1] = -FRACTAL_RADIUS;m_rectX[2] = -FRACTAL_RADIUS;m_rectY[2] = -FRACTAL_RADIUS;m_rectX[3] = -FRACTAL_RADIUS;m_rectY[3] = FRACTAL_RADIUS;}void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const{int r = rand()%10;if (r < 4){outX = (x + m_rectX[r])*0.5f;outY = (y + m_rectY[r])*0.5f;}else{outX = x*0.5f;outY = y*0.5f;}outZ = z;}private:float m_rectX[4];float m_rectY[4];
};

看上去还有点样。

(3)谢尔宾斯基五边形

四边形是不行的,那再试下五边:

// 五边形
class SierpinskiPentagon : public FractalEquation
{
public:SierpinskiPentagon(){m_StartX = 0.0f;m_StartY = 0.0f;m_StartZ = 0.0f;for (int i = 0; i < 5; i++){m_pentagonX[i] = sinf(i*PI*2/5);m_pentagonY[i] = cosf(i*PI*2/5);}}void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const{int r = rand()%5;outX = (x + m_pentagonX[r])*0.5f;outY = (y + m_pentagonY[r])*0.5f;outZ = z;}private:float m_pentagonX[5];float m_pentagonY[5];
};

有点样子,那就以此算法为基础,生成幅图像看看:

有人称谢尔宾斯基三角形为谢尔宾斯基坟垛,当我看到这幅图时,有一种恐怖的感觉。邪恶的五角形,总感觉里面有数不清的骷髅。

看来二维空间中谢尔宾斯基的单数可以生成分形图形,而双数则为无序的混沌。

(4)谢尔宾斯基四面体

再由二维扩展到三维看看:

class SierpinskiTetrahedron : public FractalEquation
{
public:SierpinskiTetrahedron(){m_StartX = 0.0f;m_StartY = 0.0f;m_StartZ = 0.0f;m_vTetrahedron[0] = YsVector(0.0f, 0.0f, 0.0f);m_vTetrahedron[1] = YsVector(0.0f, 1.0f, 0.0f);m_vTetrahedron[2] = YsVector(YD_REAL_SQRT_3/2, 0.5f, 0.0f);m_vTetrahedron[3] = YsVector(YD_REAL_SQRT_3/6, 0.5f, YD_REAL_SQRT_3*YD_REAL_SQRT_2/3);YsVector vCenter = m_vTetrahedron[0] + m_vTetrahedron[1] + m_vTetrahedron[2] + m_vTetrahedron[3];vCenter *= 0.25f;m_vTetrahedron[0] -= vCenter;m_vTetrahedron[1] -= vCenter;m_vTetrahedron[2] -= vCenter;m_vTetrahedron[3] -= vCenter;m_vTetrahedron[0] *= FRACTAL_RADIUS;m_vTetrahedron[1] *= FRACTAL_RADIUS;m_vTetrahedron[2] *= FRACTAL_RADIUS;m_vTetrahedron[3] *= FRACTAL_RADIUS;}void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const{int r = rand()%4;outX = (x + m_vTetrahedron[r].x)*0.5f;outY = (y + m_vTetrahedron[r].y)*0.5f;outZ = (z + m_vTetrahedron[r].z)*0.5f;}bool Is3D() const {return true;}private:YsVector m_vTetrahedron[4];
};

(5)其他

谢尔宾斯基三角形是一种很神的东西,我写过一些生成图像的算法,常常不知不觉中就出现了谢尔宾斯基三角形。如细胞生长机

再如:

之前我写过几篇与谢尔宾斯基分形相关的文章

分形之谢尔宾斯基(Sierpinski)三角形

分形之谢尔宾斯基(Sierpinski)地毯

分形之谢尔宾斯基(Sierpinski)四面体

 


http://chatgpt.dhexx.cn/article/yTgJHl8X.shtml

相关文章

关于谢尔宾斯基三角形(Sierpinski triangle)的讲解

谢尔宾斯基三角形&#xff08;Sierpinski triangle&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。 谢尔宾斯基&#xff08;Sierpinski&#xff09;三角形 1.画一个&#xff08;正&…

谢尔宾斯基三角形——python递归

一、 问题描述 类似于分形树&#xff0c;分形三角形——谢尔宾斯基三角形同样是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维是log(3)/log(2) ≈ 1.585。对于谢尔宾斯基三角形的构造&#xff0c;可以先作一个正三角形&#x…

Redis的RDB和AOP总结

目录 1.RDB和AOF是什么 2.RBD 2.1 配置参数 2.1.1 配置文件位置 2.1.2 save 2.1.3 stop-writes-on-bgsave-error 2.1.4 rdbcompression 2.1.5 rdbchecksum 2.1.6 dbfilename 2.1.7 dir 2.2 fork 2.3 如何触发RDB快照 2.3.1 配置文件中默认的快照配置 2.3.2 客户端使用命令sav…

redis RDB设计与实现

redis RDB设计与实现 文章目录 redis RDB设计与实现RDB功能RDB文件的创建和保存SAVE 和 BGSAVERDB保存冲突RDB文件的载入自动保存 RDB 文件结构 RDB功能 为了使Redis储存在内存中的数据库状态保存到磁盘里面防止丢失&#xff0c;Redis提供了RDB持久化功能&#xff0c;将Redis内…

比redis-rdb-tools快10倍的rdb分析工具

背景 为了满足快速分析rdb的情况&#xff0c;对rdr进行测试调研。 测试环境 测试机器&#xff1a;本机macbook pro 工具&#xff1a;rdr&#xff0c;redis-rdb-toolsrdb 文件&#xff1a;dump_7709.rdb&#xff0c;Redis实例大小3G&#xff0c;rdb文件大小1G git地址&…

Redis持久化之RDB原理

Redis持久化之RDB 一.RDB文件作用二. 触发条件三、执行流程1、总体流程2、fork实现复制原理 四、RDB文件五、 启动时加载六、 RDB常用配置总结七、优缺点1、优点2、缺点 个人复习笔记一.RDB文件作用 RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化)&a…

Redis RDB持久化

文章目录 一、持久化简介二、数据快照RDB1. save指令2. RDB文件相关配置验证save后数据保存在了rdb文件验证重启服务后&#xff0c;程序会从rdb文件中恢复数据到内存 3. bgsave指令4. 配置自动持久化5. RDB三种启动方式对比6. rdb特殊启动形式7. RDB优缺点 一、持久化简介 什么…

Redis 持久化与故障恢复之rdb

一、摘要 老生常谈一下吧&#xff0c;redis持久化分为rdb和aof两种模式&#xff0c;本篇先说一说rdb模式吧&#xff0c;共分为三部分&#xff1a;1&#xff1a;如何触发rdb持久化&#xff0c; 2&#xff1a;rdb持久化源码&#xff0c; 3&#xff1a;rdb文件解析。 ps:本文基于r…

【Redis】Redis持久化之RDB详解(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公司…

redis持久化之rdb

redis持久化之rdb RDB相关配置rdb快照的触发条件rdb快照过程rdb文件结构rdb和aof文件的加载顺序 Redis的RDB持久化方式是指将某个时刻的内存数据进行快照&#xff0c;生成.rdb文件可以用于恢复快照时刻redis的内存数据。 RDB相关配置 我们可以在redis.conf中进行rdb相关的配置…

redis之AOF和RDB持久化

写在前面 redis数据存储在内存&#xff0c;为了避免服务器重启或者是宕机导致数据全部丢失&#xff0c;提供了数据持久化机制&#xff0c;有AOF(Append Only File)和RDB&#xff0c;接下来我们分别看下。 1&#xff1a;AOF 如下是我本地环境生成aof文件&#xff1a; 1.1&am…

AOFRDB

序言 主要用于查看不同备份模式可以调优的一些方式. RDB: Redis服务器在规定时间内将内存中的数据保存到指定路径的文件中,服务器重启的时候直接将RDB文件读取到内存中AOF:Redis服务器以日志的形式追加所有的REDIS操作,服务器重启的时候读取AOF文件依次执行一遍. 关于RDB最主…

RDB持久化触发机制

RDB持久化 触发机制 手动触发 手动触发分别对应save和bgsave命令&#xff1a; save命令&#xff1a;同步&#xff0c;在主线程中保存快照&#xff1b;阻塞当前Redis服务器&#xff0c;直到RDB过程完成为止&#xff0c;对于内存比较大的实例会造成长时间阻塞&#xff0c;线上…

Redis RDB 和 AOF

导读 RDB 和 AOF 对比&#xff1a; 持久化方式选择 如果对数据安全性要求极高&#xff0c;应该同时使用两种持久化方式。 如果可以承受若干时间内的数据丢失&#xff0c;可以只使用 RDB 持久化。 不建议只使用 AOF 持久化&#xff0c;因为定时生成 RDB 快照&#xff08;s…

java读取rdb_剖析Redis RDB文件

通过redis-cli中执行save或者bgsave可以得到RDB文件(文件名由配置文件中dbfilename指定&#xff0c;例如dbfilename "dump.rdb")&#xff0c;这个文件包含Redis实例中全量的数据&#xff0c;那么dump.rdb的文件格式大概是什么样的呢&#xff1f; RDB文件定义 获取RDB…

Redis RDB文件解析

Redis RDB是什么 Redis rdb是Redis快照存储持久化方式&#xff0c;具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中&#xff0c;默认保存的文件名为dump.rdb&#xff0c;而在Redis服务器启动时&#xff0c;会重新加载dump.rdb文件的数据到内存当中恢复数据&#xff0c…

RDB 持久化详解

文章目录 持久化的执行SAVE&#xff1a;阻塞服务器并创建RDB文件BGSAVE&#xff1a;以非阻塞方式创建RDB文件通过配置文件自动创建RDB文件查看最近持久化时间 RDB优化配置1. save2. stop-write-on-bgsave-error3. rdbcompression4. rdbchecksum5. sanitize-dump-payload6. dbfi…

RDB持久化

RDB持久化 一、RDB快照实现二、快照用法三、执行快照时的数据修改四、RDB 和 AOF 合体 一、RDB快照实现 Redis 是内存数据库&#xff0c;但是它为数据的持久化提供了两个技术。 分别是「 AOF 日志和 RDB 快照」。 这两种技术都会用各用一个日志文件来记录信息&#xff0c;但…

RDB底层原理

Redis服务器自动保存功能的实现原理及文件中的各个组成部分 因为Redis是内存数据库&#xff0c;它将自己的数据库状态储存在内存里 面&#xff0c;所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面&#xff0c; 那么一旦服务器进程退出&#xff0c;服务器中的数据库…

Redis持久化原理(RDB)

在上一篇文章中&#xff0c;介绍了Redis的内存模型很重要&#xff0c;从这篇文章开始&#xff0c;将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题&#xff1b;然后详细介绍Redis的…