在Apple画面中实现yaxx+bx+c 函数曲线的绘Word格式文档下载.docx
- 文档编号:20934323
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:232.88KB
在Apple画面中实现yaxx+bx+c 函数曲线的绘Word格式文档下载.docx
《在Apple画面中实现yaxx+bx+c 函数曲线的绘Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《在Apple画面中实现yaxx+bx+c 函数曲线的绘Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
在Applet画面中实现y=a*x2+b*x+c函数曲线的绘制
设计要求:
1、通过Applet参数传递a,b,c值;
2、通过Applet参数控制曲线的粗细;
3、曲线的颜色通过颜色对话框选取(通过一个颜色按钮控制)。
4、绘制一个圆形沿曲线轨迹运动,到终点由头重新开始。
2、需求分析
利用Java2D图形绘制,在Applet画面中实现一个二维图形,其中绘制二次函数(y=a*x*x+b*y+c)曲线,通过Applet参数来传递a,b,c的值,使得能够绘制任意二次函数曲线,并通过另一个Applet参数来控制二次函数曲线的线条粗细;
建立一个颜色选择对话框来选择曲线的绘制颜色;
在二次函数曲线上要实现以一个圆形,并能沿着曲线循环运动。
该实验考察的知识点是任何绘制图形以及用什么方法来控制图形的运动,通过建立一事件监听来实现人机交互。
3、设计思路
3.1工作原理及功能规划:
起先就是创建坐标的问题,先设置坐标原点(offx,offy),以原点为中心来绘制坐标轴,通过在paint()函数建立一个Graphics2D类对象g2d,再由g2d.draw()来绘制直线就很快实现了坐标轴。
其次是绘制曲线,曲线绘制是要通过applet参数来传递a,b,c及thick的值,这就要运用到getParameter()来获取HTML中的传递的各参数。
之后就利用多边形描绘曲线,简单,创建一个GeneralPath对象:
GeneralPathpolly=newGeneralPath(),再利用moveTo()和lineTo()来实现曲线。
有一点需得提出,绘制曲线时,我将曲线的横坐标值扩大了5倍,便于图形观察。
第三步就是颜色选择对话框,这个好办,创建一个下拉列表(Choice)将所有选项折叠在一起,Choicecolor=newChoice(),再对color设置一个监听者,color.addItemListener(this)。
而颜色的添加,是通过两个数组des[]、c[],数组des[]中存放颜色名称,放入到下拉列表中,数组c[]中存放对应的颜色,在事件监听时,将到得颜色选择赋给drawColor来改变曲线的颜色。
第四步就得实现一个圆形在曲线上的运动了。
先得绘制一个圆形,通过建立图形缓冲区createImage(width,height),再将曲线坐标参数传递给drawImage(),将图像缓存区的内容绘制到Applet面板上的。
之后呢是实现其移动,就是将曲线的各个点的坐标值参数传递给圆形图像。
4、详细设计
4.1数据分析:
1.变量a,b,c,thick是数值型,都为私有变量,通过Applet参数传递的。
2.变量x0,y0是数值型,曲线的顶点坐标,用于计算和控制圆形图像的定位。
3.变量q,k同样是数值型,用来控制圆形图像在曲线上的循环运动。
4.des[]字符串数组,其元素代表颜色的选择,通过Color类定义了一个color[]颜色数组,与des[]对应来控制曲线颜色变化。
5.原点坐标offx,offy数值型,通过改点来绘制坐标轴和定位二次曲线。
4.2算法思路:
4.2.1.基本算法:
for循环:
ⅰ.for(inti=0;
i<
des.length;
i++){color.add(des[i]);
}通过循环,将颜色字符串数组加入到颜色下拉列表中。
ⅱ.for(;
x<
=50;
x++){……}计算曲线上各点的坐标值,再通过直线连接各点绘制曲线。
ⅲ.for(inti=0;
i++){……}在事件监听函数中,通过鼠标触发事件来选择绘制曲线的颜色。
4.2.2.计算几何算法:
由坐标原点(offx,offy)出发,通过g2d.draw(newLine2D.Float(……)计算绘制出坐标轴。
利用多边形描绘曲线,通过计算a*x*x+b*x+c,得到曲线上各点的坐标,在由moveTo()和lineTo()来连接各点。
同时通过计算得到圆形图像在曲线上移动的坐标,将坐标值传递给drawImage().
4.3类设计:
classConic{
init();
//用来完成对applet实例的初始化工作
paint();
//用来在applet的界面中绘制文字、图形和其他界面元素
repaint();
//用来对整个applet区域重画
Thread.sleep()//使用Thread类中的sleep()方法使圆形移动时睡眠一段时间后继续移动
itemStateChanged(ItemEvente);
//对事件源进行监听,实现事件的选择
}
4.4功能实现:
①流程图:
图1:
流程图
②代码及注释:
importjava.awt.*;
importjava.awt.geom.*;
importjava.applet.*;
importjava.awt.event.*;
publicclassConicextendsAppletimplementsItemListener{
privateinta;
privateintb;
privateintc;
privateintthick;
intx0,y0;
//曲线的顶点
Imageimg;
intq=x0-20;
//圆形起点横坐标
intk=0;
//控制圆形循环移动
ColordrawColor=Color.red;
//曲线初始颜色设置
Stringdes[]={"
红色"
"
蓝色"
绿色"
黑色"
灰色"
};
Colorcolor2[]={Color.red,Color.blue,Color.green,
Color.black,Color.gray};
publicvoidinit(){
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);
//曲线顶点横坐标
thick=Integer.parseInt(getParameter("
thick"
//从applet参数中获取thick的值
Choicecolor=newChoice();
//创建下拉列表
for(inti=0;
i++){
color.add(des[i]);
//将颜色加入列表
}
color.addItemListener(this);
//对下拉列表设置监听
this.add("
north"
color);
//添加下拉列表及其位置
/*绘制圆形*/
img=createImage(20,30);
//画板的长宽
Graphicsgimg=img.getGraphics();
gimg.setColor(Color.red);
gimg.drawOval(5,0,10,10);
}
publicvoidpaint(Graphicsg){
Graphics2Dg2d=(Graphics2D)g;
intoffx=200;
//坐标轴原点的x
intoffy=250;
//坐标轴原点的y
g2d.setPaint(Color.blue);
//设置坐标轴的颜色
g2d.setStroke(newBasicStroke
(2));
//坐标轴的线条宽度
/*绘制坐标轴*/
g2d.draw(newLine2D.Float(offx+0,offy-100,offx+0,offy+100));
g2d.draw(newLine2D.Float(offx-5,offy-97,offx+0,offy-100));
g2d.draw(newLine2D.Float(offx+5,offy-97,offx+0,offy-100));
g2d.draw(newLine2D.Float(offx-100,offy+0,offx+200,offy+0));
g2d.draw(newLine2D.Float(offx+195,offy-5,offx+200,offy+0));
g2d.draw(newLine2D.Float(offx+196,offy+5,offx+200,offy+0));
g2d.drawString("
x"
offx+205,offy);
y"
offx,offy-106);
/*利用多边形描绘曲线*/
GeneralPathpolly=newGeneralPath();
//创建一个GeneralPath对象
intx=-50;
floatx1=5*x;
//将x坐标值放大5倍
floaty1=(float)(a*x*x+b*x+c);
polly.moveTo(offx+x1,offy-y1);
//第一个点加入到路径
for(;
x++){
floatx2=5*x;
floaty2=(float)(a*x*x+b*x+c);
polly.lineTo(offx+x2,offy-y2);
//将指定点加入路径,当前点与指定点连接
g2d.setPaint(drawColor);
//绘制曲线的初始颜色
g2d.setStroke(newBasicStroke(thick));
//曲线的宽度
g2d.draw(polly);
//绘制曲线
intw=a*q*q+b*q+c;
g.drawImage(img,offx+5*q-10,offy-w-15,this);
//绘制圆形,并定位圆形在曲线上的位置
q++;
k++;
try{
Thread.sleep(100);
}catch(InterruptedExceptione){}
repaint();
if(k%40==0)q=x0-20;
//控制圆形循环移动的范围
publicvoiditemStateChanged(ItemEvente){//事件监听
Choicetemp=(Choice)e.getItemSelectable();
if(temp.getSelectedIndex()==i){
drawColor=color2[i];
repaint();
break;
}
4.5界面:
图2:
界面截图
5、运行调试与分析讨论
5.1以下为运行调试后的结果(部分截图):
①通过applet参数传递a,b,c及thick的值,thick为曲线的粗细。
可以发现曲线颜色变化了且圆形在曲线上运动:
图3:
红色曲线
图4:
绿色曲线
②改变参数c的值后的结果,可以发现曲线下移了:
图6:
曲线下移
③改变参数a,b,c及thick的值后的结果,可以发现曲线变化了且粗细变化了:
图7:
曲线粗细变化
④改变参数thick的值后的结果,可以发现曲线变粗了:
图8:
曲线变粗
⑤改变各参数的值,曲线变化,圆形同时在运动:
图9:
曲线变化
5.2分析运行结果
曲线是由参数a,b,c来控制,变量thick来控制曲线的粗细,其中这四个变量是通过applet来传递参数的,改变这四个变量的值,可以发现曲线也相应的改变了。
可见,其运行结果达到了预先的期望和要
5.3有何改进想法
像这个程序运行时看上去有些单调,虽然圆形运动的实现有些难度,但程序有些地方可以是改进的。
其中曲线坐标参数传递给小人物的方法可以改进,这里的方法稍微繁琐了一点,当然其考察到个人数学的能力;
其次我感觉参数a,b,c及thick的控制应该在程序查看器中实现,通过重新载入来改变曲线图形,但这一知识点我还未掌握,由于课本上这一知识点涉及不深,未能成功实现该动作;
再次可以设置上下左右四个Button来控制坐标轴的移动或通过鼠标来移动,这是一点创新功能,由于时间问题,在这里就不去实现了。
6、设计体会与小结
通过这次的Java课程设计,让我系统的复习了一下本学期所学的知识,不仅巩固了那些已掌握了的知识点,而且了解到许多还未掌握的方面。
尽管感觉自己学得还不错,但在这次的课设中还是遇到了许多问题,像这个圆形在双曲线上的移动问题,起先就让我感到头痛,研究了一下午,到网上又找不到相关的解决方法,但第二天上午上机时看到书上有一个被我遗漏的知识点:
双缓冲区绘图。
突然让我豁然开朗,不久就把这个问题解决了,效果还挺好的。
这次的课程设计给我的帮助非常大,尽管我做的题目没有涉及到好多的知识点,但通过考察,让我对Java产生的兴趣更浓厚,特别是按时完成任务时,比平时更有成就感。
我在这次的课程暴露的错误,让我意识到我还有许多的知识要去掌握,特别是教材之外的许多东西还不是很了解,另外是对某些知识点的了解还不够深,看来要多看点有关Java的课外书籍,及时补一补那些被遗漏的知识点。
7、参考文献
[1]丁振凡.Java语言实用教程.北京:
北京邮电大学出版社,2005.2
[2]耿祥义,张跃平.Java2实用教程.北京:
清华大学出版社,2006.8
[3]赵付青.《Java面向对象程序设计》国防工业出版社.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 在Apple画面中实现yaxx+bx+c 函数曲线的绘 Apple 画面 实现 yaxx bx 函数 曲线