所谓抽象画就是不是写实再现(此处来自度娘),而我觉得它就是人的一种思维抽象的表达,它不按常理出牌,千变万化,在混乱中又有自己的规律,在混乱中又有自己独特的美,让人看见它时思绪万千。那种美让人无法名状,那种美也是不能再复制的。
最近在学java基础课程的迭代方法,迭代是一种十分常见的算法,在数学中,迭代函数是在碎形和动力系统中深入研究的对象,而在代码的世界中我们可以利用迭代的思想结合一些迭代数学公式绘制一些美丽动人且充满艺术气息的抽象式图片。下面给大家分享一个刚刚完成的使用迭代思想来绘制图像的例子,区区几行代码你就可以成为抽象派的画家。几行代码你就可以做出如下的图片:
具体实现如下:
首先你要选择一个迭代的数学式子,百度一下很多,我选择的一个是(其中a,b,c,d为常数):
其实这样的式子也就是我们中学时学的数列,知道当前值就可以计算出写一个值,一直下去,这就是迭代的思想。
利用这个式子我们可以利用计算机计算出你想要数目的(X,Y)值,再使用java中的drawline(X,Y,X,Y)方法(当我们将画直线方法的起点坐标和末点坐标设置成一样的时候,绘制的就是一个点),将这些点绘制到画板上,并陪上颜色,就可以呈现一幅美丽的画了。下面是实现的具体代码(详细注释了):
/** * 一个公式,改变各个参数值,你就可以拥有各种各样的抽象图画,很神奇 * 使用一个按钮控制绘制 */ package 抽象图像; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class Draw extends JFrame implements ActionListener { //将画布对象设置为类的属性,可以在类的方法中使用 private Graphics g; //入口函数 public static void main(String[] args) { Draw d = new Draw(); d.init(); } // 初始化画板 public void init() { this.setTitle("神奇的函数"); this.setSize(700, 700); this.setDefaultCloseOperation(3); this.setLayout(new FlowLayout()); this.setLocationRelativeTo(null); this.getContentPane().setBackground(Color.black); this.setVisible(true); // 获取画布对象 g = this.getGraphics(); // 添加一个控制按钮 JButton bu = new JButton("画图"); bu.setActionCommand("draw"); this.add(bu); bu.addActionListener(this); } //重写ActionLitener中的方法,在此实现绘制的方法 public void actionPerformed(ActionEvent e) { //初始化x和y double x = 0, y = 0; //给公式的常量赋值,改变每个值可以得到不同的图像 double a =-1.7, b = -2.5, c = -2, d = -2; //使用循环计算出每次迭代的值,并完成绘制 for (int i = 0; i < 100000; i++) { //调用java中Math中的方法,计算函数值,计算出当前的x和y的值,下一次循环时用当前的x,y的值计算下一此的x和y的值,依次下去 x = d * Math.sin(a * x) - Math.sin(b * y); y = c * Math.cos(a * x) + Math.cos(b * y); //由于画布坐标的特点,所以作如下处理(左上角为原点,竖直向下为Y轴,计算的值太小所以*100,+330是为了将隐藏的点平移到画布上来) int m = (int) ((d * Math.sin(a * x) - Math.sin(b * y)) * 100+330); int n = (int) ((c * Math.cos(a * x) + Math.cos(b * y)) * 100+350); //给每个点上颜色,并绘制 g.setColor(new Color(250,i%255,i%155)); g.drawLine(m, n, m, n); } } }
改变式子中的常数(a,b,c,d)的值,会的到不一样的图片,同时记着给他们施以颜色,那样得到的图像会更动人,我尝试了换了几组数字,得到了几个图片,向大家展示一下,发挥你的想象的空间,绘制出更加NICE的图片:
相关推荐
递归是一种有趣的程序设计方法,往往区区几行代码就能达到神奇的效果。递归同时是一种非常数学化的方法,其背后有着深刻的数学原理。递归是程序设计方法王冠上的明珠,学会使用和优化递归是一个有灵魂的软件工程师与...
Android开发在所难免的就是UI的预览和调整,一般情况下都是直接run看效果,或者是使用AS的preview预览,但这同样带来个小问题,就是你的测试内容会跟随着代码被打包到apk中,如果没做容错的处理很有可能将测试内容...
安装完成后,我们可以编写 Python 脚本来实现键盘记录器。下面是完整的代码: ``` from pynput import keyboard def on_press(key): try: print('alphanumeric key {0} pressed'.format(key.char)) except ...
这是本人使用的非常著名的虚拟打印机软件。经典的软件,不用多说。网上很流行 这里面有两个版本。都经过测试正常使用。...只需区区几行代码更可在后台完全繁琐的转换工作,文件转换过程中让您体验其难以想像的速度。
数十行javascript代码可以被神奇地压缩成区区几行。多少Web开发人员在那一瞬间深深地迷恋上了这个方便快捷、功能完备的利器。 《jQuery实战》是带领你自如驾驭jQuery的导航者。替你肃清学习和编程路上的各种障碍...
《操作系统真相还原》通过简化示例,用区区6023行代码实现了一个功能完备的操作系统原型。它从基本的进程管理到复杂的内存管理和文件系统,都采用少量代码,力求使读者能快速学习和理解操作系统的核心概念。 本书的...
server中只有区区几行就搞定了: //创建listener TimeHandler timer = new TimeHandler(); //获取Notifier Notifier notifier = Notifier.getNotifier(); //注册监听 notifier.addListener(timer); //申请端口 Server...
C语言画心案例,区区不到50行代码,学习C语言工整的代码风格与解决问题的思路。 访问我的专栏:https://zhuanlan.zhihu.com/sylucky,总有你需要的技术。
只用区区几行代码,就可以实现二维码的快速扫描。 二、定制化显示扫描UI 1.在values的colors文件下添加颜色,决定了二维码四个边框的颜色 <color name="scan_corner_color">#0effc2</color>2. 2.在drawable文件下...
该解决方案用了区区二十几行代码,实现了别人要用几十甚至上百K的js库所做的工作.它就是John Resig 的 Microtemplating engine.大师Rick Strahl有一篇文章专门对此作了详细讲述(Client Templating with
南昌新建区区本级公共服务事项清单.doc
标题“不可思议的动画只有区区七百k”以及描述中的“放好几个小时”,揭示了视频压缩的高效性。一个只有700KB大小的文件竟然能承载足以播放数小时的动画,这背后蕴含着丰富的技术细节。 首先,我们来理解视频压缩的...
全国行政区,省、市、线面域图,ppt格式
XX年XX区区属国企改革重点工作实施方案.docx
在当前我国深化国有企业改革的背景下,XX区区属国有企业专职外部董事考核评价办法的出台,对于完善国有企业治理结构、提升决策质量、保障国有资产安全具有重要的意义。这一办法从制度层面明确了专职外部董事的职责...
五省藏区区编版汉语第九册教学方案.doc
5. **进度计划**:制定出详细的工程进度计划,通过甘特图或网络图展示各个施工阶段的时间节点,确保工程按期完成。 6. **质量控制**:提出质量管理体系,包括材料检验、工序验收、隐蔽工程检查等环节的质量标准和...
有很多人用程序来表述爱情,在其中我能看到有Money,有Girl,有一些还涉及到Sex,但是我没有找到Love,我始终相信这世上有一种力量直接来自于爱情,到现在仍然相信。*/ C#(读作C sharp),是Microsoft公司新推出的...
lovefc_Template是一个小巧,轻便,高效率的模板引擎,只有区区的十几k的大小,提供了一个模板引擎最为基础的功能,此外,还有一些对于模板语言的可扩展性,你完全可以利用它来打造自己的模板代码,更快方便的书写...
本文根据ISO 3166-1:2006(International Standard Norme Internationale) 英文版(含2007年补充说明)整理。与ISO 3166-1:1997相比,2006版新增的国家和地区已在备注栏中标出