Java趣味编程100例
2.问题分析
连续的曲线是由点组成的,点与点之间距离比较近,看上去就是曲线了,画图的关键是画出每个点。Java提供了三角函数方法,直接调用cos()方法就可以根据x坐标计算出y坐标。需要注意的是,cos()方法输入的参数是弧度值,要进行坐标转换,同样,得到的结果也要进行转换处理。从图1.6中可以看出,这条余弦曲线有两个周期,我们可以把x坐标控制在0~720。
(1)确定程序框架
从图1.6中,我们可以发现,整个图形包括x轴、y轴及余弦曲线。控制台不方便输出图形,这里以Applet形式输出。这样我们就可以写出程序框架了,代码如下:
public class Ch1_3 extends Applet { int x,y; public void start() //当一个Applet被系统调用时,系统会自动调用 start()方法 { Graphics g=getGraphics(); //画画之前,必须先取得画笔 //画x轴 //画y轴 //画cos(x)曲线 } }
(2)画x轴
为了画出图1.6所示效果,我们可以把坐标原点设定为(360,200),x轴就是从左到右的很多点组成,通过循环语句很容易实现,代码如下:
for(x=0;x<=750;x+=1) { g.drawString(\·\ }
//画x轴
细心的读者会发现,x轴上还有个箭头,这个是如何实现的呢,其实很简单,是由两条线段交汇而成。为方便起见,两条线段都与x轴成45°角,很容易得到表达式的方程:y=x–550,y=950–x。代码如下:
for(x=740;x<=750;x+=1) { g.drawString(\·\ g.drawString(\·\}
//x轴上方斜线 //x轴下方斜线
(3)画y轴
参考上面x轴的绘制,很容易画出y轴,代码如下:
//y轴
for(y=0;x<=385;y+=1) { g.drawString(\·\ }
//y轴箭头 ·6·
//画y轴
第1章 变幻多姿的图表
for(x=360;x<=370;x+=1) { g.drawString(\·\ g.drawString(\·\}
(4)画cox(x)曲线
图形的主体是cox(x)曲线,从图1.6中可以看出,这条余弦曲线有两个周期,我们可以把x坐标控制在0~720。cox(x)返回的结果小于1,为了看到图1.6效果,必须进行放大处理,这里放大了80倍,同时把图形向下平移了200个像素。代码如下:
//两个周期,即4Л
for(x=0;x<=720;x+=1) { a=Math.cos(x*Math. PI/180); y=(int)(200+80*a); //放大80倍并向下平移200个像素 g.drawString(\·\}
(5)完整程序
现在我们就需要把刚才的程序进行组合,构成我们的完整程序:
import java.applet.*; import java.awt.*;
public class Ch1_3_2 extends Applet { int x,y; public void start() { //画画之前,必须先取得画笔 Graphics g=getGraphics(); //画x轴、y轴 for(x=0;x<=750;x+=1) { g.drawString(\·\ if(x<=385) g.drawString(\·\ } g.drawString(\ //画y轴箭头 for(x=360;x<=370;x+=1) { g.drawString(\·\ g.drawString(\·\ }
//画x轴箭头 g.drawString(\ for(x=740;x<=750;x+=1) { g.drawString(\·\ g.drawString(\·\ }
//画cox()曲线 for(x=0;x<=720;x+=1) { double a=Math.cos(x*Math. PI/180+Math.PI);
·7·
Java趣味编程100例
}
}
}
y=(int)(200+80*a); g.drawString(\·\
//放大80倍并向下平移200个像素
Ch1_3.html网页代码如下:
(6)运行结果
把Ch1_3.java文件编译后的Ch1_3.class文件放到Ch1_3.html网页同一目录下,直接用IE浏览器打开Ch1_3.html,运行程序,结果如图1.6所示。
3.扩展训练
前面介绍的余弦曲线的绘制,我们看到的是一个完整的静态图形,能否动态地展现绘制的过程?答案是肯定的,我们可以采用线程的方式来实现,参考代码如下:
import java.applet.Applet; import java.awt.Color; import java.awt.Graphics;
public class donghua_cos extends Applet implements Runnable //通过实现Runnable接口实现线程操作 { int x,y; double a; int xpos=0; Thread runner; boolean painted=false; public void init() //Applet创建即启动执行,坐标初始化 { // TODO Auto-generated method stub Graphics g=getGraphics(); //画画之前,必须先取得画笔 for(x=0;x<=750;x+=1) //画x轴 { g.drawString(\·\ if(x<=385) g.drawString(\·\ } g.drawString(\ //画y轴 for(x=360;x<=370;x+=1) //画y轴箭头 { g.drawString(\·\