1、(7) 报告按规定排版打印,要求装订平整,否则要求返工;(8) 课设报告的装订顺序如下:封面-任务书-中文摘要-目录-正文-附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。4)答辩与评分标准:(1)考勤:10分;(2)程序检查:30分;(3)答辩回答问题:20分(3)课程设计报告:40分;5)参考文献:(1)丁振凡.Java语言实用教程北京邮电大学出版社 (2)耿祥义.Java2实用教程清华大学出版社6)课程设计进度安排内容 天数地点构思及收集资料 7图书馆编码与调试 5实验室撰写论文 3图书馆、实验室学生签名: 年 月 日课程设计(论文)评审意见(1)考勤(10分):优( )、
2、良( )、中( )、一般( )、差( );(2)程序检查(30分):优()、良()、中()、一般()、差();(3)答辩回答问题(20分):(4)设计报告(40分):评阅人: 职称: 讲师 目录一、课设任务及要求 1二、需求分析 1三、设计思路 1四、详细设计 2五、运行调试与分析讨论 8六、设计体会与小结 14七、参考文献 14一、课设任务及要求课程任务:在Applet画面中实现y=a*x2+b*x+c 函数曲线的绘制设计要求:1、通过Applet参数传递a,b,c值;2、通过Applet参数控制曲线的粗细;3、曲线的颜色通过颜色对话框选取(通过一个颜色按钮控制)。4、绘制一个小人沿曲线轨迹
3、运动,到终点由头重新开始。二、需求分析利用Java 2D图形绘制,在Applet画面中实现一个二维图形,其中绘制二次函数(y=a*x*x+b*y+c)曲线,通过Applet参数来传递a,b,c的值,使得能够绘制任意二次函数曲线,并通过另一个Applet参数来控制二次函数曲线的线条粗细;建立一个颜色选择对话框来选择曲线的绘制颜色;在二次函数曲线上要实现以一个小人物,并能沿着曲线循环运动。该实验考察的知识点是任何绘制图形以及用什么方法来控制图形的运动,通过建立一事件监听来实现人机交互。三、设计思路工作原理及功能规划:我选择的这个课设题目,说实话,前面三部分思路非常清晰,但最后一部分思路稍稍有点难度
4、。正因如此,让我感觉富有挑战性。下面我就介绍一下我的具体思路。起先就是创建坐标的问题,先设置坐标原点(offx,offy),以原点为中心来绘制坐标轴,通过在paint()函数建立一个Graphics2D 类对象g2d,再由g2d.draw()来绘制直线就很快实现了坐标轴。其次是绘制曲线,曲线绘制是要通过applet参数来传递a,b,c及thick的值,这就要运用到getParameter()来获取HTML中的传递的各参数。之后就利用多边形描绘曲线,简单,创建一个GeneralPath对象:GeneralPath polly=new GeneralPath(),再利用moveTo()和lineT
5、o()来实现曲线。有一点需得提出,绘制曲线时,我将曲线的横坐标值扩大了5倍,便于图形观察。第三步就是颜色选择对话框,这个好办,创建一个下拉列表(Choice)将所有选项折叠在一起,Choice color=new Choice( ),再对color设置一个监听者,color.addItemListener(this)。而颜色的添加,是通过两个数组des、c,数组des中存放颜色名称,放入到下拉列表中,数组c中存放对应的颜色,在事件监听时,将到得颜色选择赋给drawColor来改变曲线的颜色。 第四步就得实现一个小人物在曲线上的运动了。先得绘制一个小人物,通过建立图形缓冲区createImage
6、(width,height),再将曲线坐标参数传递给drawImage( ),将图像缓存区的内容绘制到Applet面板上的。之后呢是实现其移动,就是将曲线的各个点的坐标值参数传递给小人物图像。四、详细设计(1)数据分析:1.变量a,b,c,thick是数值型,都为私有变量,通过Applet参数传递的。2.变量x0,y0是数值型,曲线的顶点坐标,用于计算和控制人物图像的定位。3.变量q,k同样是数值型,用来控制人物图像在曲线上的循环运动。4.des字符串数组,其元素代表颜色的选择,通过Color类定义了一个color颜色数组,与des对应来控制曲线颜色变化。5.原点坐标offx,offy数值型,
7、通过改点来绘制坐标轴和定位二次曲线。(2)算法思路:1.基本算法:for循环:.for(int i=0;ides.length;i+)color.add(desi);通过循环,将颜色字符串数组加入到颜色下拉列表中。.for(;x=50;x+)计算曲线上各点的坐标值,再通过直线连接各点绘制曲线。.for(int i=0;i+)在事件监听函数中,通过鼠标触发事件来选择绘制曲线的颜色。2.计算几何算法:由坐标原点(offx,offy)出发,通过g2d.draw(new Line2D.Float()计算绘制出坐标轴。利用多边形描绘曲线,通过计算a*x*x+b*x+c,得到曲线上各点的坐标,在由move
8、To()和lineTo()来连接各点。同时通过计算得到人物图像在曲线上移动的坐标,将坐标值传递给drawImage().(3)类设计: class Conic init(); /用来完成对applet实例的初始化工作 paint();/用来在applet的界面中绘制文字、图形和其他界面元素 repaint();/用来对整个applet区域重画 Thread.sleep()/使用Thread类中的sleep()方法使小人物移动时睡眠一段时间后继续移动itemStateChanged(ItemEvent e);/对事件源进行监听,实现事件的选择 (4)功能实现:流程图:代码及注释:import j
9、ava.awt.*;import java.awt.geom.*;import java.applet.*;import java.awt.event.*;public class Conic extends Applet implements ItemListener private int a ; private int b ; private int c ; private int thick; int x0,y0; /曲线的顶点 Image img; int q=x0-20;/小人物起点横坐标 int k=0; /控制小人物循环移动 Color drawColor=Color.red;
10、 /曲线初始颜色设置 String des=红色,蓝色绿色黑色灰色; Color color2=Color.red,Color.blue,Color.green,Color.black,Color.gray; public void init() a=Integer.parseInt(getParameter(a); /从applet参数中获取a的值 b=Integer.parseInt(getParameter(b /从applet参数中获取b的值 c=Integer.parseInt(getParameter(c /从applet参数中获取c的值 x0=-b/(2*a); /曲线顶点横坐标
11、 thick=Integer.parseInt(getParameter(thick /从applet参数中获取thick的值 Choice color=new Choice(); /创建下拉列表 for(int i=0;i+) color.add(desi); /将颜色加入列表 color.addItemListener(this); /对下拉列表设置监听 this.add(north,color); /添加下拉列表及其位置/*绘制小人物*/ img=createImage(20,30); /画板的长宽 Graphics gimg=img.getGraphics(); gimg.setCol
12、or(Color.red); gimg.drawOval(5,0,10,10); gimg.drawLine(10,10,0,20); gimg.drawLine(10,10,20,20); gimg.drawLine(0,20,20,20); gimg.drawLine(5,15,0,10); gimg.drawLine(15,15,20,10); gimg.drawLine(7,20,7,30); gimg.drawLine(13,20,13,30); public void paint(Graphics g) Graphics2D g2d=(Graphics2D)g; int offx=
13、200; /坐标轴原点的x int offy=250; /坐标轴原点的y g2d.setPaint(Color.blue);/设置坐标轴的颜色 g2d.setStroke(new BasicStroke(2);/坐标轴的线条宽度/*绘制坐标轴*/ g2d.draw(new Line2D.Float(offx+0,offy-100,offx+0,offy+100); g2d.draw(new Line2D.Float(offx-5,offy-97,offx+0,offy-100); g2d.draw(new Line2D.Float(offx+5,offy-97,offx+0,offy-100)
14、; g2d.draw(new Line2D.Float(offx-100,offy+0,offx+200,offy+0); g2d.draw(new Line2D.Float(offx+195,offy-5,offx+200,offy+0); g2d.draw(new Line2D.Float(offx+196,offy+5,offx+200,offy+0); g2d.drawString(x,offx+205,offy);y,offx,offy-106);/*利用多边形描绘曲线*/ GeneralPath polly=new GeneralPath();/创建一个GeneralPath对象
15、int x=-50; float x1=5*x; /将x坐标值放大5倍 float y1=(float)(a*x*x+b*x+c); polly.moveTo(offx+x1,offy-y1); /第一个点加入到路径 for(;x+) float x2=5*x; float y2=(float)(a*x*x+b*x+c); polly.lineTo(offx+x2,offy-y2); /将指定点加入路径,当前点与指定点连接 g2d.setPaint(drawColor); /绘制曲线的初始颜色 g2d.setStroke(new BasicStroke(thick);/曲线的宽度 g2d.dr
16、aw(polly); /绘制曲线 int w = a * q* q + b * q + c; g.drawImage(img,offx+5*q-10,offy-w-15,this);/绘制小人物,并定位人物在曲线上的位置 q+; k+; try Thread.sleep(100); catch (InterruptedException e) repaint(); if(k%40=0) q=x0-20; /控制小人物循环移动的范围 public void itemStateChanged(ItemEvent e) /事件监听 Choice temp=(Choice)e.getItemSelec
17、table(); if(temp.getSelectedIndex()=i) drawColor=color2i; repaint(); break; (5)界面:五、运行调试与分析讨论(1)以下为运行调试后的结果(部分截图):通过applet参数传递a,b,c及thick的值,thick为曲线的粗细。可以发现曲线颜色变化了且小人物在曲线上运动:红色曲线颜色选择绿色曲线改变参数c的值后的结果,可以发现曲线下移了:改变参数a,b,c及thick的值后的结果,可以发现曲线变化了且粗细变化了:改变参数thick的值后的结果,可以发现曲线变粗了:改变各参数的值,曲线变化,小人物同时在运动:(2)分析运
18、行结果曲线是由参数a,b,c来控制,变量thick来控制曲线的粗细,其中这四个变量是通过applet来传递参数的,改变这四个变量的值,可以发现曲线也相应的改变了。小人物是通过双缓冲区绘图,将曲线各点的参数值传递给它实现的,同样发现它一直在不停地运动。还有改变曲线的颜色是通过建立一个下拉列表实现,下拉列表中存放了5中颜色,对下拉列表建立一个事件监听,通过鼠标点击来改变曲线颜色。可见,其运行结果达到了预先的期望和要求。(3)有何改进想法 像这个程序运行时看上去有些单调,虽然小人物运动的实现有些难度,但程序有些地方可以是改进的。其中曲线坐标参数传递给小人物的方法可以改进,这里的方法稍微繁琐了一点,当
19、然其考察到个人数学的能力;其次我感觉参数a,b,c及thick的控制应该在程序查看器中实现,通过重新载入来改变曲线图形,但这一知识点我还未掌握,由于课本上这一知识点涉及不深,未能成功实现该动作;再次可以设置上下左右四个Button来控制坐标轴的移动或通过鼠标来移动,这是一点创新功能,由于时间问题,在这里就不去实现了。六、设计体会与小结通过这次的Java课程设计,让我系统的复习了一下本学期所学的知识,不仅巩固了那些已掌握了的知识点,而且了解到许多还未掌握的方面。尽管感觉自己学得还不错,但在这次的课设中还是遇到了许多问题,像这个小人物在双曲线上的移动问题,起先就让我感到头痛,研究了一下午,到网上又
20、找不到相关的解决方法,但第二天上午上机时看到书上有一个被我遗漏的知识点:双缓冲区绘图。突然让我豁然开朗,不久就把这个问题解决了,效果还挺好的。这次的课程设计给我的帮助非常大,尽管我做的题目没有涉及到好多的知识点,但通过考察,让我对Java产生的兴趣更浓厚,特别是按时完成任务时,比平时更有成就感。我在这次的课程暴露的错误,让我意识到我还有许多的知识要去掌握,特别是教材之外的许多东西还不是很了解,另外是对某些知识点的了解还不够深,看来要多看点有关Java的课外书籍,及时补一补那些被遗漏的知识点。七、参考文献1丁振凡. Java语言实用教程. 北京:北京邮电大学出版社,2005.22耿祥义,张跃平. Java2实用教程.北京:清华大学出版社,2006.8