⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plotting.java

📁 用Java开发的实用数学建模程序 简单易懂 初学者可以用来学习java知识
💻 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 + -