《计算机图形学》实验2实验报告.docx
《《计算机图形学》实验2实验报告.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》实验2实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
![《计算机图形学》实验2实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/23/6be20611-821b-49e5-b3d9-d6b661a49f23/6be20611-821b-49e5-b3d9-d6b661a49f231.gif)
《计算机图形学》实验2实验报告
实验2实验报告格式
《计算机图形学》实验2实验报告
实验题目:
多视图绘图程序
实验内容:
掌握多视图绘图的概念,掌握二维统计图的绘制方法。
调用实验1中自己编写的基本包,绘制自己所设计的统计图形(饼图、直方图以及折线)。
编写程序调用验证之。
参考程序:
有一个示范程序MultiViewport.java
基本概念:
(详细叙述自己对实验内容的理解)
多视图绘图:
就是将若干个绘制好的图形按照一定的规则,组成一个具有特定意义的图形,在同一个视图中显示出来。
算法设计:
(详细叙述自己设计的多视图统计图以及程序的功能、算法及实现)
饼图:
仅排列在工作表的一列或一行中的数据可以绘制到饼图中。
饼图显示一个数据系列中各项的大小与各项总和的比例。
饼图中的数据点显示为整个饼图的百分比。
本程序中的饼图统计的是学生成绩状况。
直方图:
又称柱状图、质量分布图。
是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。
本程序使用矩形的填充来实现柱状图形。
程序中横轴表示成绩分段,纵轴表示人数分布。
折线:
以折线的上升或下降来表示统计数量的增减变化的统计图,叫作折线统计图。
可以反应事物的变化趋势。
本程序是统计学生成绩趋势,折线的转折点就是某个等级的人数所占总人数的比例。
本程序功能:
实现饼图、直方图和折线对学生成绩的统计。
饼图算法:
根据各个类别所占总统计数的比例来确定其在饼图中所占的比例大小,每一个类别就是一个扇形,扇形的大小是根据所占比例确定的。
假设在中等成绩段的学生人数是m人,统计的总人数是n人,那么中等成绩段在饼图中的比例就是m/n,其在饼图中的大小是m/n*360。
直方图算法:
根据每个类别占总调查人数的比例来确定柱状图的高低,每一个类别所占的比例就是一个矩形在直方图中的相对高度,一个类别就是用一个矩形表示,矩形的宽度就是成绩分布段。
如果在图中绘制出来就是按照每个类别所占的比例扩大或缩小多少倍,在图形中较好的表现出来。
如果人数多,则柱状就会高,反之则低。
折线算法:
以折线的上升或下降来表示统计数量的增减变化的统计图,叫作折线统计图。
在本程序中的折线的每一段都是一条线段。
简单的说,就是将直方图的柱状的最高点改为一个点,然后将不同类别的点连接起来,就形成了折线图。
折线的转折点就是某个等级的人数所占总人数的比例。
代码:
(给出主要的Java程序和注解)
(1)画圆饼统计图
package实验2;
//MultiViewport.java
//多视图程序
importjava.awt.*;//绘图基于javaAWT包
importjava.applet.Applet;
//定义多视图类
publicclassMultiViewportextendsApplet{
MyCanvasm;//定义MyCanvas类的对象
finalstaticintidealSizeX=600;//窗口宽度
finalstaticintidealSizeY=600;//窗口高度
//Applet程序的自动初始化方法init
publicvoidinit(){
this.setSize(700,600);
m=newMyCanvas(this);//生成MyCanvas类的对象
}
//画圆饼统计图(成绩统计)
publicvoidpaintPIGraph_1(MyCanvasm){
doubler=0.8;//外圆半径
doublecr=0.3;//内圆半径
/*利用三基色构造颜色*/
m.setColor(newColor((float)0.95,(float)0.75,(float)0.6));
doubleexcellent=0.15*360;//优秀占15%对应的扇形角
m.fillArc(0,0,r,r,0,excellent);//从0度起画"优秀"对应的扇形
/*扇弧终止点的坐标*/
doubleexcellentX=r*Math.sin(excellent*Math.PI/180);
doubleexcellentY=r*Math.cos(excellent*Math.PI/180);
doublesum=excellent;//从0度起已经画出的扇弧角度
m.setColor(newColor((float)0.80,(float)0.80,(float)0.50));
doublegood=0.25*360;//良好占25%对应的扇形角
m.fillArc(0,0,r,r,sum,good);//从sum度起画"良好"对应的扇形
sum+=good;//从0度起已经画出的扇弧角度
/*扇弧终止点的坐标*/
doublegoodX=r*Math.sin(sum*Math.PI/180);
doublegoodY=r*Math.cos(sum*Math.PI/180);
m.setColor(newColor((float)0.65,(float)0.85,(float)0.40));
doublemedium=0.35*360;//中等占35%对应的扇形角
m.fillArc(0,0,r,r,sum,medium);//从sum度起画"中等"对应的扇形
sum+=medium;//从0度起已经画出的扇弧角度
doublemediumX=r*Math.sin(sum*Math.PI/180);//扇弧终止点的坐标
doublemediumY=r*Math.cos(sum*Math.PI/180);
m.setColor(newColor((float)0.50,(float)0.90,(float)0.30));
doublepass=0.20*360;//及格占20%对应的扇形角
m.fillArc(0,0,r,r,sum,pass);//从sum度起画"及格"对应的扇形
sum+=pass;//从0度起已经画出的扇弧角度
doublepassX=r*Math.sin(sum*Math.PI/180);//扇弧终止点的坐标
doublepassY=r*Math.cos(sum*Math.PI/180);
m.setColor(newColor((float)0.35,(float)0.95,(float)0.2));
doublefail=0.05*360;//优秀占5%对应的扇形角
m.fillArc(0,0,r,r,sum,fail);//从sum度起画"不及格"对应的扇形
sum+=fail;//从0度起已经画出的扇弧角度
doublefailX=r*Math.sin(sum*Math.PI/180);//扇弧终止点的坐标
doublefailY=r*Math.cos(sum*Math.PI/180);
m.setColor(Color.black);//当前颜色
m.drawOval(0,0,r,r);//画(椭)圆
m.drawLine(0,0,0,r);//画起点方位半径
m.drawLine(0,0,excellentX,excellentY);//画扇形分界线半径
m.drawLine(0,0,goodX,goodY);
m.drawLine(0,0,mediumX,mediumY);
m.drawLine(0,0,passX,passY);
m.drawLine(0,0,failX,failY);
/*定义字体,标准大小*/
Fontf0=m.MyFont(m.getFont().getName(),m.getFont().getStyle(),1.0);
m.setFont(f0);//设定字体
m.drawString("优秀",0.1,0.47);//写字符串
m.drawString("15%",0.1,0.30);
m.drawString("良好",0.25,0.0);//写字符串
m.drawString("25%",0.25,-0.15);
m.drawString("中等",-0.28,-0.3);//写字符串
m.drawString("35%",-0.28,-0.45);
m.drawString("及格",-0.5,0.17);//写字符串
m.drawString("20%",-0.5,0.02);
m.drawLine(-0.1,0.47,-0.2,1.0);//画引线
m.drawString("不及格",-0.2,1.15);//写字符串
m.drawString("5%",-0.2,1.0);
Fontf1=m.MyFont(m.getFont().getName(),m.getFont().getStyle(),1.5);//字体放大
m.setFont(f1);
m.drawString("成绩统计图",-0.4,-1.2);//写字符串
}//圆饼统计图结束
//Applet程序的描绘方法paint
publicvoidpaint(Graphicsg){
m.setBackground(Color.white);//当前背景色
m.setWindow(-1,1,-1,1);//用户坐标系范围
//视图定义(第一个圆饼统计图在窗口的位置)
m.setViewport(0.5,1.0,0.25,0.75);//窗口右半面,上下居中
paintPIGraph_1(m);//画饼统计图
m.setViewport(0.0,0.5,0.25,0.75);//窗口左半面,上下居中
paintPIGraph_1(m);//再画圆饼统计图
m.resetViewport();//视图复位
Fontf2=m.MyFont(m.getFont().getName(),m.getFont().getStyle(),2.0);//字体放大
m.setFont(f2);
m.drawString("多视图演示程序",-0.4,-0.9);//写字符串
}//描绘方法paint结束
}//显式曲线描绘类结束
(2)画折线统计图
package实验2;
//MultiViewport.java
//多视图程序
importjava.awt.*;//绘图基于javaAWT包
importjava.applet.Applet;
//定义多视图类
publicclassMultiViewport2extendsApplet{
MyCanvasm;//定义MyCanvas类的对象
finalstaticintidealSizeX=600;//窗口宽度
finalstaticintidealSizeY=600;//窗口高度
//Applet程序的自动初始化方法init
publicvoidinit(){
m=newMyCanvas(this);//生成MyCanvas类的对象
}
//画折线图
publicvoidpaintPIGraph_1(MyCanvasm){
m.setColor(Color.BLACK);//设定前景色为黑色
m.setWindow(-1,1,-1,1);//设定用户坐标系范围
//缺省的视图为m.setViewport(0,1,0,1)和JavaAWT窗口大小一样
m.drawLine(-0.9,-2.9,4.9,-2.9);//画X轴
double[]x1={4.9,5.0,4.9};//箭头三个点的X坐标
double[]y1={-2.8,-2.9,-3.0};//箭头三个点的Y坐标
m.fillPolygon(x1,y1,3);//填充箭头
m.drawString("X轴",4.0,-5.0);//X轴写字符串
m.drawLine(-0.9,-2.9,-0.9,1.8);//画Y轴
double[]x2={-0.8,-0.9,-1.0};//箭头三个点的X坐标
double[]y2={1.8,1.9,1.8};//箭头三个点的Y坐标
m.fillPolygon(x2,y2,3);//填充箭头
m.drawString("Y轴",-0.7,1.8);//Y轴写字符串
//优秀占15%,良好占25%,中等占35%,及格占20%,不及格占5%
//画出Y轴上的刻度线与距离
m.drawString("0",-1.1,-3.0);//Y轴上的距离0
m.drawString("10",-1.3,-2.0);
m.drawLine(-0.9,-1.9,-0.8,-1.9);//刻度线
m.drawString("20",-1.3,-1.0);
m.drawLine(-0.9,-0.9,-0.8,-0.9);//刻度线
m.drawString("30",-1.3,0);
m.drawLine(-0.9,0.1,-0.8,0.1);//刻度线
m.drawString("40",-1.3,1.0);
m.drawLine(-0.9,1.1,-0.8,1.1);//刻度线
//画出X轴上的刻度线与距离
m.drawString("100",-0.6,-3.3);
m.drawLine(-0.1,-2.9,-0.1,-2.8);//刻度线
m.drawString("85",0.3,-3.3);
m.drawLine(0.5,-2.9,0.5,-2.8);//刻度线
m.drawString("75",0.9,-3.3);
m.drawLine(1.1,-2.9,1.1,-2.8);//刻度线
m.drawString("60",1.5,-3.3);
m.drawLine(1.7,-2.9,1.7,-2.8);//刻度线
m.drawString("0分",2.3,-3.3);
m.drawLine(2.3,-2.9,2.3,-2.8);//刻度线
//画出折线
m.setColor(Color.RED);//设置颜色
m.drawLine(-0.1,-1.5,0.5,-0.5);//画线
m.setColor(Color.BLUE);
m.drawLine(0.5,-0.5,1.1,0.5);
m.setColor(Color.GREEN);
m.drawLine(1.1,0.5,1.7,-1.0);
m.setColor(Color.ORANGE);
m.drawLine(1.7,-1.0,2.3,-2.5);
//对折线图进行说明
m.setColor(Color.blue);
m.drawString("深红色代表优秀到良好的趋势",2.6,0.6);
m.drawString("蓝色代表良好到中等的趋势",2.6,0.2);
m.drawString("绿色代表中等到及格的趋势",2.6,-0.2);
m.drawString("橘色代表及格到不及格的趋势",2.6,-0.6);
m.drawString("X轴代表成绩",2.6,-1.0);
m.drawString("Y轴代表在成绩段的人数",2.6,-1.4);
m.setColor(Color.RED);
m.drawString("折线图演示",0.3,-3.9);;
}//折线图结束
//Applet程序的描绘方法paint
publicvoidpaint(Graphicsg){
m.setBackground(Color.white);//当前背景色
m.setWindow(-1,1,-1,1);//用户坐标系范围
//视图定义(第一个圆饼统计图在窗口的位置)
m.setViewport(2.9,3.4,0.15,0.65);//窗口右半面,上下居中
paintPIGraph_1(m);//画饼统计图
m.setViewport(0.2,0.7,0.15,0.65);//窗口左半面,上下居中
paintPIGraph_1(m);//再画圆饼统计图
m.resetViewport();//视图复位
Fontf2=m.MyFont(m.getFont().getName(),m.getFont().getStyle(),2.0);//字体放大
m.setFont(f2);
m.drawString("多视图演示程序",-0.4,-0.9);//写字符串
}//描绘方法paint结束
}//显式曲线描绘类结束
(3)画直方图统计图
package实验2;
//MultiViewport.java
//多视图程序
importjava.awt.*;//绘图基于javaAWT包
importjava.applet.Applet;
//定义多视图类
publicclassMultiViewport2extendsApplet{
MyCanvasm;//定义MyCanvas类的对象
finalstaticintidealSizeX=600;//窗口宽度
finalstaticintidealSizeY=600;//窗口高度
//Applet程序的自动初始化方法init
publicvoidinit(){
m=newMyCanvas(this);//生成MyCanvas类的对象
}
//画直方统计图
publicvoidpaintPIGraph_1(MyCanvasm){
m.setColor(Color.BLACK);//设定前景色为黑色
m.setWindow(-1,1,-1,1);//设定用户坐标系范围
//缺省的视图为m.setViewport(0,1,0,1)和JavaAWT窗口大小一样
m.drawLine(-0.9,-2.9,4.9,-2.9);//画X轴
double[]x1={4.9,5.0,4.9};//箭头三个点的X坐标
double[]y1={-2.8,-2.9,-3.0};//箭头三个点的Y坐标
m.fillPolygon(x1,y1,3);//填充箭头
m.drawString("X轴",4.9,-2.7);//X轴写字符串
m.drawLine(-0.9,-2.9,-0.9,1.8);//画Y轴
double[]x2={-0.8,-0.9,-1.0};//箭头三个点的X坐标
double[]y2={1.8,1.9,1.8};//箭头三个点的Y坐标
m.fillPolygon(x2,y2,3);//填充箭头
m.drawString("Y轴",-0.7,1.8);//Y轴写字符串
//优秀占15%,良好占25%,中等占35%,及格占20%,不及格占5%
//画出Y轴上的刻度线与距离
m.drawString("0",-1.1,-3.0);//Y轴上的距离0
m.drawString("100",-1.3,-2.0);//Y轴上的距离0.1
m.drawLine(-0.9,-1.9,-0.8,-1.9);//刻度线
m.drawString("200",-1.3,-1.0);//Y轴上的距离0.2
m.drawLine(-0.9,-0.9,-0.8,-0.9);//刻度线
m.drawString("300",-1.3,0);//Y轴上的距离0.3
m.drawLine(-0.9,0.1,-0.8,0.1);//刻度线
m.drawString("400",-1.3,1.0);//Y轴上的距离0.4
m.drawLine(-0.9,1.1,-0.8,1.1);//刻度线////画出矩形条
m.setColor(Color.yellow);//设置矩形条的颜色
m.fillRect(-0.6,-2.9,1.0,-1.5);//画出矩形条
m.setColor(Color.BLUE);//设置矩形条的颜色
m.fillRect(0.1,-2.9,0.8,-0.5);//画出矩形条
m.setColor(Color.red);//设置矩形条的颜色
m.fillRect(0.8,-2.9,1.6,0.5);//画出矩形条
m.setColor(Color.green);//设置矩形条的颜色
m.fillRect(1.6,-2.9,2.2,-1.0);//画出矩形条
m.setColor(Color.orange);//设置矩形条的颜色
m.fillRect(2.2,-2.9,2.8,-2.5);//画出矩形条
m.setColor(Color.black);//设置矩形条的颜色
//对直方图进行说明
m.drawString("优秀",-0.9,-3.4);
m.drawString("良好",0.0,-3.4);
m.drawString("中等",0.8,-3.4);
m.drawString("及格",1.6,-3.4);
m.drawString("不及格",2.3,-3.4);
m.drawString("黄色代表优秀占15%",2.6,0.6);
m.drawString("蓝色代表良好占25%",2.6,0.2);
m.drawString("红色代表中等占35%",2.6,-0.2);
m.drawString("绿色代表及格占20%",2.6,-0.6);
m.drawString("橘色代表不及格占5%",2.6,-1.0);
m.drawString("X轴代表成绩分布段",2.6,-1.4);
m.drawString("Y轴代表在成绩段的人数",2.6,-1.8);
m.setColor(Color.RED);
m.drawString("直方统计图