利用java打印心型图案 落尘曦的博客--落尘曦的博客
问题分析
心形图案的实现,重点是心形函数r=a(1–sinθ),据说这是笛卡尔死前寄出的最后一封情书的内容,这里面隐藏着一个刻骨铭心的秘密:“一生只为等待能手绘这个函数给我的人”。心形函数要做直角坐标系转换,然后投影到xOy平面上,就可以调用画椭圆方法来实现画心形图案。
(1)确定程序框架
为了提高图像的显示效果,须采用双缓冲技术。首先初始化缓冲区,接着绘制图像,然后再显示在Applet窗口中。程序框架代码如下:
import java.applet.Applet;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;public class First extends Applet{ int width, height; Image image; //缓冲区对象Graphics g1; public void init()//Applet初始化时调用{ setBackground(Color.black); //设置背景this.setSize(350, 310); width = getSize().width; //获得窗口宽度height = getSize().height; image = createImage(width, height); //创建图像对象g1 = image.getGraphics(); } public void paint(Graphics g)//绘图方法{ g1.clearRect(0, 0, width, height); g1.setColor(Color.blue); ....//显示缓存区的可变Image对象g.drawImage(image, 0, 0, this); } }
绘制图案
由前面的问题分析可知,心形函数为r=a(1–sinθ),要做直角坐标系转换,然后投影到xOy平面上,坐标确定下来后调用画椭圆方法来画心形图案上的点。程序代码如下:
for(int i = 0; i <= 90; i++) //控制横向变化for(int j = 0; j <= 90; j++)//控制竖向变化{ //转换为直角坐标double r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j)) * 18; double x = r * Math.cos(Math.PI / 45 * j) * Math.sin(Math.PI / 45 * i) + width / 2; //为了在中间显示,加了偏移量double y = -r * Math.sin(Math.PI / 45 * j) + height / 4;//为了在中间显示,加了偏移量g1.fillOval((int) x, (int)y, 2,2);//绘制点}
完整代码
import java.applet.Applet;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;public class First extends Applet{ int width, height; Image image; //缓冲区对象Graphics g1; public void init()//Applet初始化时调用{ setBackground(Color.black); //设置背景this.setSize(350, 310); width = getSize().width; //获得窗口宽度height = getSize().height; image = createImage(width, height); //创建图像对象g1 = image.getGraphics(); } public void paint(Graphics g)//绘图方法{ g1.clearRect(0, 0, width, height); g1.setColor(Color.blue); for(int i = 0; i <= 90; i++) //控制横向变化for(int j = 0; j <= 90; j++)//控制竖向变化{ //转换为直角坐标double r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j)) * 18; double x = r * Math.cos(Math.PI / 45 * j) * Math.sin(Math.PI / 45 * i) + width / 2; //为了在中间显示,加了偏移量double y = -r * Math.sin(Math.PI / 45 * j) + height / 4;//为了在中间显示,加了偏移量g1.fillOval((int) x, (int)y, 2,2);//绘制点}//显示缓存区的可变Image对象g.drawImage(image, 0, 0, this); } }
更标准的心形