Java面向对象编程:利用递归思想绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”

article/2025/8/29 14:32:50

1、递归:在方法中调用本方法。

2、递归调用会无限循环下去,因此方法体中必须有结束方法的条件。返回值为void时通常写为:

if (条件) {return;
}

下面使用递归绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”。


谢尔宾斯基地毯。

1)取一个正方形。

2)绘制出该正方形的九宫格。

3)保留中间的九宫格,擦除其他线。

4)对九宫格的其余八个正方形重复步骤2-3。

效果图如下:

完整代码如下:

import javax.swing.*;
import java.awt.*;public class SierpinskiCarpet extends JFrame {@Overridepublic void paint(Graphics g) {super.paint(g);int x = 100;int y = 100;int width = 729;int height = 729;g.drawRect(x, y, width, height);drawSierpinskiCarpet(g, x, y, width, height);}public void drawSierpinskiCarpet(Graphics g, int x, int y, int width, int height) {if (width <= 1) {return;}//小正方形int _width = width / 3;int _height = height / 3;int _x = x + _width;int _y = y + _height;g.drawRect(_x, _y, _width, _height);width /= 3;height /= 3;drawSierpinskiCarpet(g, x, y, width, height);drawSierpinskiCarpet(g, x + width, y, width, height);drawSierpinskiCarpet(g, x + width * 2, y, width, height);drawSierpinskiCarpet(g, x, y + height, width, height);drawSierpinskiCarpet(g, x + width * 2, y + height, width, height);drawSierpinskiCarpet(g, x, y + height * 2, width, height);drawSierpinskiCarpet(g, x + width, y + height * 2, width, height);drawSierpinskiCarpet(g, x + width * 2, y + height * 2, width, height);}public static void main(String[] args) {SierpinskiCarpet sierpinskiCarpet = new SierpinskiCarpet();sierpinskiCarpet.setTitle("Sierpiński Carpet");sierpinskiCarpet.setSize(1000, 1000);sierpinskiCarpet.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);sierpinskiCarpet.setVisible(true);}
}

①重写paint() 方法:负责绘制出大正方形,并调用drawSierpinskiCarpet() 方法。

②drawSierpinskiCarpet() 方法:递归地绘制中间的小正方形。

        - 终止条件:小正方形边长≤1(每递归一次边长除以3);

        - 绘制小正方形; 

        - 递归调用drawSierpinskiCarpet() ,在八个位置分别绘制1/3倍大小的小正方形。

 

程序运行结果:

更改终止条件:小正方形边长≤9,运行结果:


 

谢尔宾斯基三角形。

1)取一个三角形。

2)沿三边中点的连线,将它分成四个小三角形。

3)去掉中间的那一个小三角形。

4)对其余三个小三角形重复步骤1。

效果图如下:

 

完整代码如下:

import javax.swing.*;
import java.awt.*;
import static java.lang.Math.sqrt;public class SierpinskiTriangle extends JFrame {@Overridepublic void paint(Graphics g) {super.paint(g);int ax = 100;int ay = 100;int bx = 1124;int by = 100;int cx = 100;int cy = 1124;Point a = new Point(ax, ay);Point b = new Point(bx, by);Point c = new Point(cx, cy);drawTriangle(g, a, b, c);
//        drawSierpinskiCarpet(g, x, y, width, height);Point d = new Point(a, b);Point e = new Point(a, c);Point f = new Point(b, c);drawTriangle(g, d, e, f);drawSierpinskiTriangle(g,a,b,c);}public void drawTriangle(Graphics g, Point a, Point b, Point c) {g.drawLine(a.x, a.y, b.x, b.y);g.drawLine(a.x, a.y, c.x, c.y);g.drawLine(b.x, b.y, c.x, c.y);}public void drawSierpinskiTriangle(Graphics g, Point a, Point b, Point c) {if (Point.PointDistance(a, b) <= 8) {return;}Point d = new Point(a, b);Point e = new Point(a, c);Point f = new Point(b, c);drawTriangle(g, d, e, f);drawSierpinskiTriangle(g, a, d, e);drawSierpinskiTriangle(g, d, b, f);drawSierpinskiTriangle(g, e, f, c);}public static void main(String[] args) {SierpinskiTriangle sierpinskiTriangle = new SierpinskiTriangle();sierpinskiTriangle.setTitle("Sierpiński Triangle");sierpinskiTriangle.setSize(1200, 1200);sierpinskiTriangle.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);sierpinskiTriangle.setVisible(true);}
}class Point {int x;int y;public Point(int x, int y) {this.x = x;this.y = y;}public Point(Point a, Point b) {this.x = (a.x + b.x) / 2;this.y = (a.y + b.y) / 2;}public static double PointDistance(Point a, Point b) {double distance = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));return distance;}
}

 ①Point类:

        - 定义创建两个点的中点的构造函数Point(Point a, Point b)。

        - 定义求两个点之间距离的方法PointDistance(Point a, Point b)。

②SierpinskiTriangle类:

        - 重写paint() 方法:负责绘制出大三角形(本程序采用等腰直角三角形),并调用drawSierpinskiTriangle() 方法。

        - drawTriangle() 方法:Graphics库并没有给出绘制三角形的函数,我们在程序中通过调用三次drawLine() 方法绘制出三角形。

        - drawSierpinskiTriangle() 方法:递归地绘制小三角形。

                - 终止条件:直角边的长度≤8

                - 更新三角形的顶点:调用构造方法Point(Point a, Point b)。

                - 递归调用drawSierpinskiTriangle() ,在三个位置分别绘制小三角形。

程序运行结果:

 更改终止条件:小三角形直角边长≤32,运行结果:

 


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

相关文章

谢尔宾斯基三角形:Python+turtle

本来觉得谢尔宾斯基三角形挺难的。分析以后&#xff0c;其实还是挺简单的。 挺好理解&#xff0c;供大家一起学习 """功能&#xff1a;绘制谢尔宾斯基三角形环境&#xff1a;python3.7日期&#xff1a;2019/1/14 21:49作者&#xff1a;指尖魔法师版本&#xf…

用PYTHON画谢尔宾斯基三角形(代码可复制)

今天我们来画一个谢尔宾斯基三角形。 好我们先看原图: 这是一个等边三角形&#xff0c;把每一条边平均分成两份&#xff0c;再把这三个焦点连起来&#xff0c;形成四个等边三角形&#xff0c;中间的一个不看&#xff0c;紧接着再继续按着刚刚的步骤走&#xff0c;就可以画出来…

Python实验舱谢尔宾斯基三角形绘制教程

三角形&#xff0c;大家应该再熟悉不过了。 上图是一个由四个小三角形拼成的大三角形&#xff0c;也叫谢尔宾斯基三角形。 谢尔宾斯基三角形还能继续画下去&#xff1a; 2阶&#xff08;上图是1阶&#xff09;&#xff1a; 3阶&#xff1a; 5阶&#xff1a; 8阶&#xff1a; …

谢尔宾斯基三角新

谢尔宾斯基三角形&#xff08;英语&#xff1a;Sierpinski triangle&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出。它是自相似集的例子。它的豪斯多夫维 1.取一个实心的三角形。&#xff08;多数使用等边三角形&#xff09; 2.沿三边中点的连线&am…

谢尔宾斯基三角形的讲解

谢尔宾斯基三角形是数学家谢尔宾斯基提出的⼀个分形图形&#xff0c;谢尔宾斯基三⻆形和谢尔宾斯基地毯基本类似&#xff0c;不同之处在于谢尔宾斯基三⻆形采⽤的是等边三⻆形进⾏分形构造&#xff0c;⽽谢尔宾斯地毯基采⽤的是正⽅形进⾏分形构造。 下面是我的代码展示&#x

谢尔宾斯基三角用Python做,你知道吗?

大家好&#xff0c;我叫王若冲。因为我妈叫我冲姐&#xff0c;所以你们也可以这么叫我。今天是我的第一篇文章&#xff0c;就给大家讲谢尔宾斯基三角的代码吧。如果你既想要试一试&#xff0c;又懒得自己写代码&#xff0c;那么原代码就在下面。*注意&#xff0c;这次我用的软件…

学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

科赫曲线和谢尔宾斯基三角形是常见的分形图形&#xff08;详细介绍见参考文献1&#xff09;&#xff0c;本文使用turtle库绘制这两类图形。 科赫曲线 科赫曲线的详细介绍见参考文献2&#xff0c;其中的绘图思路是“画正三角形&#xff0c;并把每一边三等分,取三等分后的一边中…

谢尔宾斯基三角形

谢尔宾斯基三角形&#xff08;英语&#xff1a;Sierpinski triangle&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出 取一个实心的三角形。&#xff08;多数使用等边三角形&#xff09;沿三边中点的连线&#xff0c;将它分成四个小三角形。去掉中间的那…

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

本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形。 &#xff08;1&#xff09;谢尔宾斯基三角形 给三角形的3个顶点&#xff0c;和一个当前点&#xff0c;然后以以下的方式进行迭代处理&#xff1a; a.随机选择三角形的某一个顶点&#xff0c;计算出它与当前点的中点位置…

关于谢尔宾斯基三角形(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…