📄 plotting.java
字号:
/*
*@(#)Plotting.java 2.0 2005/05/14
*
*清华大学 精密仪器与机械学系
*范灿升 fancansheng@163.com
*/
package plot;
import java.awt.Graphics;
import java.awt.Color;
import java.util.Arrays;
import function.Function;
/**
*该类是用于绘制函数图像的。
*<p>在这个软件中,该类的方法主要是供给类{@link input.FitInput}使用。
*@version 2.0, 2005/05/14
*@author 范灿升
*@see input.FitInput
*@see algorithm.Fit
*/
public class Plotting
{
private int i;
private Graphics g;
private int width,height;
private Color backGround;
private int logoHeight;
private double percentage;//xSpace及ySpace所占相应的Max-Min的百分比
private double xOrigin,yOrigin;//原点的x,y坐标
/**
*x最小值,用于确定缩放比例
*/
public double xMin;
/**
*x最大值,用于确定缩放比例
*/
public double xMax;
/**
*y最小值,用于确定缩放比例
*/
public double yMin;
/**
*y最大值,用于确定缩放比例
*/
public double yMax;
/**
*缩放比例,图上距离比实际距离,即double/int
*/
public double xScale;
/**
*缩放比例,图上距离比实际距离,即double/int
*/
public double yScale;
/**
*x方向的最大最小值到绘图左边界、上边界的距离(不是图形边界)
*/
public double xSpace;
/**
*y方向的最大最小值到绘图左边界、上边界的距离(不是图形边界)
*/
public double ySpace;
/**
*指定要把数据区间分成多少份,用于确定y的最大最小值。
*<p>parts的默认值是200。
*/
public int parts=200;
/**
*构造Plotting类,用于绘制函数图像。
*@param g 绘图所用的Graphics类,函数图像被写入到该实例中。
*@param width g图形区域的宽度,是整体宽度。
*@param height g图形区域的高度,是整体高度。
*@param backGround 背景颜色。
*@param percentage xSpace及ySpace所占绘图区域宽与高的百分比。
*@param logoHeight 预留的写logo的高度。
*/
public Plotting(Graphics g,int width,int height,Color backGround,double percentage,int logoHeight)
{
this.g=g;
this.width=width;
this.height=height;
this.backGround=backGround;
this.percentage=percentage;
this.logoHeight=logoHeight;
g.setColor(backGround);
g.fillRect(0,0,width,height);
}
/**
*查找最大值。
*@param data 数据数组
*@return data中的最大值
*/
public double maximum(double[] data)
{
double[] copy=(double[])data.clone();
Arrays.sort(copy);
return copy[data.length-1];
}
/**
*查找最小值。
*@param data 数据数组
*@return data中的最小值
*/
public double minimum(double[] data)
{
double[] copy=(double[])data.clone();
Arrays.sort(copy);
return copy[0];
}
/**
*绘制数据点以及坐标轴。
*数据点用一个实心圆圈表示。
*<p>如果0介于xMin和xMax之间,则y轴的横坐标为0,否则为xMin。
*<p>如果0介于yMin和yMax之间,则x轴的纵坐标为0,否则为yMin。
*<p>也就是说,保证原点在大多数情况下位于图形的左下角。
*@param xData x坐标值
*@param yData y坐标值
*@param pointColor 点的颜色
*@param axisColor 坐标轴的颜色
*@param radius 用来表示点的圆圈的半径
*/
public void plotPoints(double[] xData,double[] yData,Color pointColor,Color axisColor,int radius)
{
int xOriginTrue,yOriginTrue;//图象上的原点
xOriginTrue=(int)((xSpace+xOrigin-xMin)/xScale);
yOriginTrue=(int)((ySpace+yMax-yOrigin)/yScale);
g.setColor(axisColor);
g.drawLine(0,yOriginTrue,width,yOriginTrue);//x轴
g.drawLine(xOriginTrue,0,xOriginTrue,height);//y轴
String coordinates="( "+(float)xOrigin+", "+(float)yOrigin+" )";
g.drawString(coordinates,xOriginTrue+5,yOriginTrue+15);
int i;
int xTrue,yTrue;//标有True的都是int类型
g.setColor(pointColor);
for(i=0;i<xData.length;i++)
{
xTrue=(int)((xData[i]-xMin+xSpace)/xScale)-radius;
yTrue=(int)((yMax-yData[i]+ySpace)/yScale)-radius;
g.fillOval(xTrue,yTrue,2*radius,2*radius);
}
}
/**
*绘制数据点、坐标轴及函数曲线。
*@param f 曲线的函数关系式
*@param xData x坐标值
*@param yData y坐标值
*@param curveColor 曲线的颜色
*@param pointColor 点的颜色
*@param radius 用来表示点的圆圈的半径
*/
public void plotAll(Function f,double[] xData,double[] yData,Color curveColor,Color pointColor,Color axisColor,int radius)
{
xMax=maximum(xData);
xMin=minimum(xData);
yMax=maximum(yData);
yMin=minimum(yData);
double xDelta=(xMax-xMin)/parts;
double xx,yy;
for(xx=xMin;xx<=xMax;xx+=xDelta)
{
yy=f.yValue(xx);
if(yy>yMax)
yMax=yy;
else if(yy<yMin)
yMin=yy;
}
//定最值
if(xMin<=0 && xMax>=0)
xOrigin=0;
else
xOrigin=xMin;
if(yMin<=0 && yMax>=0)
yOrigin=0;
else
yOrigin=yMin;
//定原点
xScale=(1+2*percentage)*(xMax-xMin)/width;
yScale=(1+2*percentage)*(yMax-yMin)/(height-logoHeight);
xSpace=percentage*(xMax-xMin);
ySpace=percentage*(yMax-yMin)+logoHeight*yScale;
plotPoints(xData,yData,pointColor,axisColor,radius);
g.setColor(curveColor);
int xTrueOld,yTrueOld,xTrueNew,yTrueNew;
double xDouble,yDouble;
xTrueNew=0;
xDouble=xTrueNew*xScale-xSpace+xMin;
yDouble=f.yValue(xDouble);
yTrueNew=(int)((yMax-yDouble+ySpace)/yScale);
for(xTrueNew=1;xTrueNew<=width;xTrueNew++)
{
xTrueOld=xTrueNew-1;
yTrueOld=yTrueNew;
xDouble=xTrueNew*xScale-xSpace+xMin;
yDouble=f.yValue(xDouble);
yTrueNew=(int)((yMax-yDouble+ySpace)/yScale);
g.drawLine(xTrueOld,yTrueOld,xTrueNew,yTrueNew);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -