在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx

上传人:b****6 文档编号:7806488 上传时间:2023-01-26 格式:DOCX 页数:16 大小:232.88KB
下载 相关 举报
在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx_第1页
第1页 / 共16页
在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx_第2页
第2页 / 共16页
在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx_第3页
第3页 / 共16页
在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx_第4页
第4页 / 共16页
在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx

《在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx》由会员分享,可在线阅读,更多相关《在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx(16页珍藏版)》请在冰豆网上搜索。

在Apple画面中实现yaxx+bx+c 函数曲线的绘.docx

在Apple画面中实现yaxx+bx+c函数曲线的绘

*******************

实践教学

*******************

 

软件学院

2013年春季学期

Java课程设计说明书

 

题目:

在Apple画面中实现y=a*x*x+b*x+c函数曲线的绘

专业班级软件四班

姓名:

康贺

学号:

1417700442

指导教师:

成绩:

摘要

在Apple画面中实现y=a*x*x+b*x+c函数曲线的绘制,曲线是由参数a,b,c来控制,变量thick来控制曲线的粗细,其中这四个变量是通过applet来传递参数的,改变这四个变量的值,可以发现曲线也相应的改变了。

圆形是通过双缓冲区绘图,将曲线各点的参数值传递给它实现的,同样发现它一直在不停地运动。

还有改变曲线的颜色是通过建立一个下拉列表实现,下拉列表中存放了5中颜色,对下拉列表建立一个事件监听,通过鼠标点击来改变曲线颜色。

可见,其运行结果达到了预先的期望和要求.

关键词:

参数值绘图传递颜色

 

1、课设任务及要求

课程任务:

在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

ⅱ.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);

g2d.drawString("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<=50;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();

for(inti=0;i

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中颜色,对下拉列表建立一个事件监听,通过鼠标点击来改变曲线颜色。

可见,其运行结果达到了预先的期望和要

5.3有何改进想法

像这个程序运行时看上去有些单调,虽然圆形运动的实现有些难度,但程序有些地方可以是改进的。

其中曲线坐标参数传递给小人物的方法可以改进,这里的方法稍微繁琐了一点,当然其考察到个人数学的能力;其次我感觉参数a,b,c及thick的控制应该在程序查看器中实现,通过重新载入来改变曲线图形,但这一知识点我还未掌握,由于课本上这一知识点涉及不深,未能成功实现该动作;再次可以设置上下左右四个Button来控制坐标轴的移动或通过鼠标来移动,这是一点创新功能,由于时间问题,在这里就不去实现了。

 

6、设计体会与小结

通过这次的Java课程设计,让我系统的复习了一下本学期所学的知识,不仅巩固了那些已掌握了的知识点,而且了解到许多还未掌握的方面。

尽管感觉自己学得还不错,但在这次的课设中还是遇到了许多问题,像这个圆形在双曲线上的移动问题,起先就让我感到头痛,研究了一下午,到网上又找不到相关的解决方法,但第二天上午上机时看到书上有一个被我遗漏的知识点:

双缓冲区绘图。

突然让我豁然开朗,不久就把这个问题解决了,效果还挺好的。

这次的课程设计给我的帮助非常大,尽管我做的题目没有涉及到好多的知识点,但通过考察,让我对Java产生的兴趣更浓厚,特别是按时完成任务时,比平时更有成就感。

我在这次的课程暴露的错误,让我意识到我还有许多的知识要去掌握,特别是教材之外的许多东西还不是很了解,另外是对某些知识点的了解还不够深,看来要多看点有关Java的课外书籍,及时补一补那些被遗漏的知识点。

 

7、参考文献

[1]丁振凡.Java语言实用教程.北京:

北京邮电大学出版社,2005.2

[2]耿祥义,张跃平.Java2实用教程.北京:

清华大学出版社,2006.8

[3]赵付青.《Java面向对象程序设计》国防工业出版社.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1