📄 samplinggraphic.java
字号:
/* 这个Servlet程序用来生成JPEG图片 */
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
public class SamplingGraphic extends HttpServlet
{
float[] samplingTimes = new float[4]; // 用以存放样本被抽取的次数
float[] samplingPrecent = new float[4]; // 存放抽取的概率
int samplingTotTimes = 0; // 用于存放总的抽样次数
int i = 0;
public void doPost(HttpServletRequest rq,HttpServletResponse rp)
{
try
{
doGet(rq,rp);
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
public void doGet(HttpServletRequest rq,HttpServletResponse rp)
{
String remark = null;
Color color[]={Color.magenta,Color.orange,Color.blue,Color.green};
int baseAng = 30;
int totalAng = 0;
int[] ang = new int[4];
int totalang = 0;
ServletOutputStream out = null;
BufferedImage image = null;
Graphics2D g = null;
AffineTransform at = null;
Arc2D arc = null;
JPEGImageEncoder encoder = null;
int fromAng = -1;
int r = 6;
int dx = -1;
int dy = -1;
try
{
getSamplingTimes(); // 读取取抽样的次数
getSamplingPrecent(); // 计算被抽中的概率
for(i = 0;i < samplingPrecent.length - 1;i++)
{
/* 按照比例计算角度 */
ang[i] = (int)(samplingPrecent[i] * 360);
totalang = totalang + ang[i];
}
ang[samplingPrecent.length - 1] = 360 - totalang;
rp.setContentType("image/jpeg"); // 定义Servlet的输出格式为JPEG的图象文件格式
out = rp.getOutputStream(); // 定义Servlet的输出流
/* 以下是开始利用JAVA 2D中的方法(函数)作图,*/
/* 利用不同的颜色和圆弧的大小表示百分比数 */
image = new BufferedImage(150,100,BufferedImage.TYPE_INT_RGB);
g = (Graphics2D)image.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.white);
g.fillRect(0,0,150,100);
fromAng = baseAng;
at = AffineTransform.getRotateInstance((-20 * Math.PI) / 180,45,37);
g.setTransform(at);
dx = (int)(r * Math.cos((baseAng + ang[0]) / 2.0 * Math.PI / 180));
dy = (int)(r * Math.sin((baseAng + ang[0]) / 2.0 * Math.PI / 180));
arc = new Arc2D.Double(10 + dx,24 - dy,80,50,fromAng,ang[0],Arc2D.PIE);
g.setColor(color[0]);
g.fill(arc);
fromAng = fromAng + ang[0];
for(i = 1;i < ang.length;i++)
{
g.setColor(color[i]);
arc = new Arc2D.Double(10,24,80,50,fromAng,ang[i],Arc2D.PIE);
g.fill(arc);
fromAng = fromAng + ang[i];
if(fromAng > 360)
{
fromAng = fromAng - 360;
}
}
at = AffineTransform.getRotateInstance(0,arc.getCenterX(),arc.getCenterY());
g.setTransform(at);
for(i = 0;i < ang.length;i++)
{
/* 打印标注和文字注解 */
g.setColor(color[i]);
g.fillRect(100,15 * i + 20,5,5);
remark = String.valueOf(new Float(samplingPrecent[i] * 100).intValue()) + "%";
g.drawString(remark,110,15 * i + 20 + 8);
}
encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
public void getSamplingPrecent()
{
/* 本方法是计算抽到的概率 */
if(samplingTotTimes == 0)
{
samplingTotTimes = 1;
}
for(i = 0;i < samplingTimes.length;i++)
{
samplingPrecent[i] = samplingTimes[i] / samplingTotTimes;
}
}
public void getSamplingTimes()
{
/* 本方法用来读取保存的抽样次数 */
String getFileRec = null;
String Samplingresultfilename = null;
BufferedReader file = null;
StringTokenizer st = null;
Samplingresultfilename = "C:\\jswdk-1.0.1\\webpages\\sampling\\samplingResult.inc";
try
{
/* 首先从文件中读出数据 */
file = new BufferedReader(new FileReader(Samplingresultfilename));
getFileRec = file.readLine();
if (getFileRec == null)
{
for(i = 0;i < samplingTimes.length;i++)
{
samplingTimes[i] = 0;
}
}
else
{
/* 然后,将数据按照“|”分割符分割开来并且存入数组 */
st = new StringTokenizer(getFileRec,"|");
samplingTotTimes = Integer.parseInt(st.nextToken().trim());
for(i = 0;i < samplingTimes.length;i++)
{
samplingTimes[i] = Integer.parseInt(st.nextToken().trim());
}
}
}
catch(Exception e)
{
System.out.println("读取数据错误" + e.toString());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -