分形之门格海绵

article/2025/1/7 6:45:29

门格海绵解决思路:

1. 迭代如何实现

2. 立方体该怎么画

3. 实现门格海绵代码

4. 画图板+门格海绵代码

在这里插入图片描述

1. 迭代如何实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了实现从1图—>2图—>3图效果,我们就要想到用迭代去实现.

因为像3图这样的图形,是由若干个2图这样的基本图形组成的

那么,怎样实现镂空的效果呢?

观察2图

2图的正方体可以分成3层结构:
在这里插入图片描述
下层有8个小正方体,中层有4个,上层有8个.

所以我们现在思考的就是怎样画出基本图形的这三层

但是在画之前,我们先思考一下:哪一层先画呢:?

如果是按上–>中–>下的顺序,我们会得到:

在这里插入图片描述
很明显,这和我们所需要的图形是不一致的

所以答案是:下–>中–>上

那么,问题又来了,每一层的的小正方体是按什么顺序画呢?

通过上一个问题的测试,我们可以知道,每一层的正方体,距离我们近的后画,距离我们远的先画,才会达到立方体正确叠加的效果.

2. 立方体该怎么画

好了.确定完上面这些,我们再来确定最基本的问题,正方体该怎么画?

(x,y)正方体正面左上角的点

dx,dy:因为我们在视觉上除了正面是正方形,其余面都是平行四边形,所以增加一个偏移值

d:正方体的边长
在这里插入图片描述
有了这些值,我们就可以确定各个顶点的坐标

颜色的话,自由发挥,只要颜色深度:上面>右侧面>正面,且

//上面
int[] xs1={x,x+d,x+d+dx,x+dx};
int[] ys1={y,y,y-dy,y-dy};
g.setColor(new Color(0,50,50));
g.fillPolygon(xs1, ys1, 4);//fillPolygon就是画填充多边形,传进的参数就是x坐标的数组,y坐标的数组,顶点的数量//右侧面
int[] xs2={x+d,x+d+dx,x+d+dx,x+d};
int[] ys2={y,y-dy,y-dy+d,y+d};
g.setColor(new Color(0,100,100));
g.fillPolygon(xs2, ys2, 4);//正面         	
g.setColor(new Color(0,160,160));     	
g.fillRect(x, y, d, d);

3. 实现门格海绵代码

因为画正方体的过程是先画最里层,最小的,才有叠加的效果,所以,只要迭代没进行到底,还要继续迭代,再去画正方体

    public void drawSponge(Graphics g,int n,int x,int y,int dx,int dy,int d){//n为迭代的层数//从里往外画,从上往下画n--;if(n>0){   //最下层drawSponge(g,n,x+2*dx/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3+2*d/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x,y+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+d/3,y+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*d/3,y+2*d/3,dx/3,dy/3,d/3);//中间层drawSponge(g,n,x+2*dx/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);drawSponge(g,n,x,y+d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*d/3,y+d/3,dx/3,dy/3,d/3);//最上层drawSponge(g,n,x+2*dx/3,y-2*dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3,y-dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3+2*d/3,y-dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x,y,dx/3,dy/3,d/3);drawSponge(g,n,x+d/3,y,dx/3,dy/3,d/3);drawSponge(g,n,x+2*d/3,y,dx/3,dy/3,d/3);     		  		}else{int[] xs1={x,x+d,x+d+dx,x+dx};int[] ys1={y,y,y-dy,y-dy};g.setColor(new Color(0,50,50));g.fillPolygon(xs1, ys1, 4);int[] xs2={x+d,x+d+dx,x+d+dx,x+d};int[] ys2={y,y-dy,y-dy+d,y+d};g.setColor(new Color(0,100,100));g.fillPolygon(xs2, ys2, 4);g.setColor(new Color(0,160,160));     	g.fillRect(x, y, d, d);}     	}  

4. 画图板+门格海绵代码

我们把门格海绵加到画图板上

并且添加按钮,实现,点击按钮后,根据之后按下的点的坐标画图的效果

画图板类:

import javax.swing.JFrame;               //窗体
import javax.swing.JButton;              //按钮import java.awt.FlowLayout;              //流式布局器
import java.awt.Graphics;                //画笔public class DrawPad {public static void main(String args[]){DrawPad dp = new DrawPad();dp.showUI();}public void showUI(){JFrame jf = new JFrame();DrawPadListener dl = new DrawPadListener();JButton btn = new JButton("门格海绵");btn.setName("门格海绵");btn.addActionListener(dl);jf.add(btn);}FlowLayout fl = new FlowLayout();jf.setTitle("可视化");                  //名称jf.setSize(800,600);               //尺寸jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //关闭进程jf.setLayout(fl);            //设置流式布局jf.setResizable(false);      //不可以改变窗体大小jf.setLocationRelativeTo(null);//居中显示jf.addMouseListener(dl);jf.setVisible(true);             //设置窗体可视Graphics g = jf.getGraphics();		dl.g = g;}}

画图板监听器类:

import java.awt.Color;               //颜色
import java.awt.Graphics;            //画笔
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//动作监听器
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; //鼠标监听器public class DrawPadListener implements MouseListener, ActionListener{	String btnstr;//记录按钮的字符串Graphics g;	int x1,x2,y1,y2;int n = 1;//迭代层数,自己去改public void actionPerformed(ActionEvent e){btnstr = e.getActionCommand();System.out.println("actionPerformed方法被调用,btnstr为:"+btnstr);			}public void mouseClicked(MouseEvent e){System.out.println("点击");		}public void mousePressed(MouseEvent e){System.out.println("按下");x1=e.getX();y1=e.getY();}public void mouseReleased(MouseEvent e){System.out.println("释放");x2=e.getX();y2=e.getY();//释放点的坐标if(btnstr.equals("门格海绵"))drawSponge(g,n,x1,y1,99,99,198);//数值可以自己改//友情提示:dx,dy,d尽量选择3的倍数,不要海绵上可能会出现一条明显的直线}public void mouseEntered(MouseEvent e){System.out.println("进入");}public void mouseExited(MouseEvent e){System.out.println("退出");}public void drawSponge(Graphics g,int n,int x,int y,int dx,int dy,int d){//从里往外画,从上往下画n--;if(n>0){   //最下层drawSponge(g,n,x+2*dx/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3+2*d/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x,y+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+d/3,y+2*d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*d/3,y+2*d/3,dx/3,dy/3,d/3);//中间层drawSponge(g,n,x+2*dx/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);drawSponge(g,n,x,y+d/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*d/3,y+d/3,dx/3,dy/3,d/3);//最上层drawSponge(g,n,x+2*dx/3,y-2*dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3,y-dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x+dx/3+2*d/3,y-dy/3,dx/3,dy/3,d/3);drawSponge(g,n,x,y,dx/3,dy/3,d/3);drawSponge(g,n,x+d/3,y,dx/3,dy/3,d/3);drawSponge(g,n,x+2*d/3,y,dx/3,dy/3,d/3);   }else{int[] xs1={x,x+d,x+d+dx,x+dx};int[] ys1={y,y,y-dy,y-dy};g.setColor(new Color(0,50,50));g.fillPolygon(xs1, ys1, 4);int[] xs2={x+d,x+d+dx,x+d+dx,x+d};int[] ys2={y,y-dy,y-dy+d,y+d};g.setColor(new Color(0,100,100));g.fillPolygon(xs2, ys2, 4);g.setColor(new Color(0,160,160));     	g.fillRect(x, y, d, d);}     	}
}

http://chatgpt.dhexx.cn/article/2bvLGMiL.shtml

相关文章

JAVA学习日志之门格海绵

门格海绵的结构可以用以下方法形象化: 从一个正方体开始。(第一个图像) 把正方体的每一个面分成9个正方形。这将把正方体分成27个小正方体,像魔方一样。 把每一面的中间的正方体去掉,把最中心的正方体也去掉&#xff0…

复杂分形,简单规则:门格海绵世界探秘

连绵的山川、飘浮的云朵、岩石的断裂口、布朗粒子运动的轨迹、树冠、花菜、大脑皮层……这些部分与整体以某种方式相似的形体,可以说,就是“分形”的要义了,也恰恰是这些“不规则的”、“分散的”、“支离破碎的”物体又重新让我们认识了自然…

JQData | 高校版使用教程,30秒安装完成,自带Python环境

本地量化金融数据JQData,是聚宽数据团队专门为金融机构、学术团体和量化研究者们提供的本地量化金融数据服务。自有版权,支持国内多家头部券商实盘交易。历经15万量化研究者与数百家机构使用验证。 JQData目前已支持国内30 高校,本次更新&…

JQData + matplotlib 实现回测日志的交易细节可视化 量化数据接口

原文:https://zhuanlan.zhihu.com/p/49051899 前言: 做量化交易的朋友都知道回测的重要性,回测结果是衡量一个量化交易策略是否靠谱的重要依据。回测平台会按历史行情数据模拟成交,并将回测结果汇总成报告。 在很多时候&#xf…

Note: Python学习笔记 -- Anaconda install jqdata

运行代码下列代码,提示错误 没有安装 jqdata。打开Anaconda Prompt 输入 pip install jqdata 提示cannot find command git然后百度了半天,有人说 pip install git 出错可以使用 conda install git 但是依然出错。最后去官网下载了Git:https://git-scm.…

jq使用教程01_最贴心教程,安装JQData全靠这篇指南

Hi, 各位亲爱的小伙伴们! 近来听说有部分小伙伴在安装JQData时遇到了点小麻烦,导致最后没有安装成功,为了帮助小伙伴们快速成功安装JQData,小编今天来为大家排一下“雷”,希望能帮到你们哟 (・ω&#xff6…

事件驱动的选股小工具(JQData)

昨天发改委下发了《关于积极推进风电、光伏发电无补贴平价上网有关工作的通知》,也不知道对股市是利空还是利多。连夜做了一个搜索公司经营范围的小工具,看看那些股票受到影响。 以后还可以增加筛选条件,比如财务指标,剔除ST股票,…

股票python量化交易008-JoinQuant中JQData的使用

查阅JoinQuant中JQData的使用文档python代码实现导入JQData,并认证用户身份。认证完毕显示“auth success”后即可使用 from jqdatasdk import *; auth(ID,Password);#ID是申请时所填写的手机号;Password为聚宽官网登录密码 # 查询jqdata的调用次数情况 surplus_count = g…

jqdata pyechart: 用grid双图实现k线带图成交 — by QUANTAXIS

from jqdatasdk import * from pyecharts import Kline,Bar,Grid 首先我们先应JQDATA 的活动演示一下如何调用pyecharts 画图 auth(acc,password) dataget_price(000001.XSHE) auth success先打印下 data 我们可以看到 jqdata返回的格式是 一个单index的Dataframe data.he…

Quant | JQData使用API简单梳理(二)

聚宽平台实际上提供了两种查询数据的方法,第一种是线上在聚宽平台可以使用的API:jqdata,另外一种则是本地的接口:JQData,是的,你没有看错,只是大小写的不同,搞得一开始我以为完全是同一种。jqdata可以线上通过import jqdata来引入数据接口,本地的JQData则是通过import…

jqdata(data是什么文件格式)

期货交易中bar和tick是什么意思 Bar 的概念 在一定时间段内的时间序列就构成了一根 K 线(日本蜡烛图),单根 K 线被称为 Bar。 如果是一分钟内的 Tick 序列,即构成一根分钟 K 线,又称分钟 Bar; 如果是一天内的分钟序列,即构成一根日…

JQData | 量化界最好用的本地量化金融数据(free free~)

什么是本地量化金融数据 - JQData ? 使用JQData本地量化金融数据服务,可快速查看、计算或接入金融数据信息,解决本地、web、自研金融终端调用数据的需求。支持python多版本及多操作系统。为财经类企业、金融机构、学术研究机构和量化爱好者们…

获取股票数据【使用JQData查询行情数据、财务指标、估值指标】

了解股票: 在上一次量化小科普【什么是量化?常用的股票量化指标、如何搭建量化交易系统】对于量化的概念有了一个基本认识,其中量化的主体在这门课程的学习中是“股票”,而当别人问你:“什么是股票?”&…

JQData安装的问题(本地调用的量化金融数据接口-免费)

JQData简介(1)JQData是聚宽数据团队专门为有志于从事量化投资的金融机构、研究人员以及个人量化爱好者提供的本地量化金融数据。用户只需在本地Python环境下安装JQData数据包,输入三行代码,即可调用由聚宽数据团队专业生产的全套量化金融数据,让你轻松告别平台限制,灵活安…

JQData安装(转)

首先,JQData是基于python的一个数据包,所以安装JQData的第一步是安装Python (没有接触过python或者python基础不好的小伙伴,可以关注聚宽量化课堂的python讲堂进行python学习)。 对于python安装包的选择,…

JQData安装的问题(只解决安装的问题)

1. JQData简介 (1)JQData是聚宽数据团队专门为有志于从事量化投资的金融机构、研究人员以及个人量化爱好者提供的本地量化金融数据。用户只需在本地Python环境下安装JQData数据包,输入三行代码,即可调用由聚宽数据团队专业生产的…

JQData-本地调用的量化金融数据接口(免费)

什么是聚宽数据-JQData? 使用JQData金融数据服务,可快速查看、计算或接入金融数据信息,解决本地、web、自研金融终端调用数据的需求。支持python多版本及多操作系统。为财经类企业、金融机构、学术研究机构和量化爱好者们提供一站式财经信息服务及数据解决方案。 提供哪些…

JQData安装 | 最贴心教程,安装JQData全靠这篇指南

转自 JQData安装 | 最贴心教程,安装JQData全靠这篇指南 Hi, 各位亲爱的小伙伴们! 首先,感谢聚宽小编 JQData01 给我开放了更多的数据访问资源 近来听说有部分小伙伴在安装JQData时遇到了点小麻烦,导致最后没有安装成功&#xff0c…

如何理解敏捷开发

目录 什么是敏捷开发 2.0 常用的 4 种开发模式 瀑布式开发 迭代式开发 螺旋式开发 敏捷软件开发 4 种开发模式总结 什么是 DevOps 精益管理的7个原则 DevOps的开发流程 提交 编译 单元测试 部署到测试环境中 预生产测试 部署到生产环境 敏捷开发 2.0 解决的问…

什么是敏捷?什么是敏捷开发?

什么是敏捷? 显示敏捷相互馈送的各个方面的关系图,例如协作、开发和自动化版本控制和部署。 敏捷是一个术语,描述软件开发方法,强调增量交付、团队协作、持续规划和持续学习。 敏捷术语于 2001 年在敏捷宣言中创造。 宣言旨在制定…