所谓抽象画就是不是写实再现(此处来自度娘),而我觉得它就是人的一种思维抽象的表达,它不按常理出牌,千变万化,在混乱中又有自己的规律,在混乱中又有自己独特的美,让人看见它时思绪万千。那种美让人无法名状,那种美也是不能再复制的。
最近在学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的图片:
原文:ITeye