import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.Graphics;
import java.awt.event.*;
public class GraphApplet extends Applet implements Runnable, MouseListener {
private int delay=20;
private int nWindowWidth=500;//平滑窗口大小
private int alpha=6;//控制显示的参数
private double beta=1.9;//控制斜率的参数
private double hold=10.0;//斜率阈值
private int nMax=40;//阈值,超过此阈值,开始修改斜率
private int nMin=-40;
private int bUp=0;//控制上升还是下降0正常1上升2下降
Thread thread;
private int[] nPosXY;//存放坐标信息的数组,数组下标为x值,相应单元存的为y值
private int nOffset=0;//偏移量
boolean bPause=false;//暂停标志
boolean bFirst=true;//第一次显示
private Image offImg;//声明备用屏幕类型
private Graphics offG;//声明备用屏幕绘图类型
static Random rand = new Random();
private int[] nRand = new int[nWindowWidth];//用于存放产生的随即数,以及平滑处理
public void init()
{
setBackground(Color.black);
addMouseListener(this);
try
{
offImg=createImage(getSize().width,getSize().height);//创建备用屏幕
offG=offImg.getGraphics();//获取备用屏幕绘图环境
}
catch(Exception e)
{
offG=null;
showStatus("备用屏幕初始化失败!");
}
//初始化坐标数组
nPosXY=new int[getSize().width];
for(int x=0;x<nPosXY.length;x++)
{
nPosXY[x]=(int)f(x);
}
//初始化随机数数组
for(int i=0;i<nRand.length;i++)
nRand[i]=rand.nextInt()%(alpha*getSize().height);
//初始化阈值为屏幕坐标
nMax=getSize().height/2-nMax;
nMin=getSize().height/2-nMin;
}
public void start()
{
thread=new Thread(this);//启动线程
thread.start();
nOffset=nPosXY.length;
}
public void stop()
{
thread=null;//停止线程
nPosXY=null;
nRand=null;
removeMouseListener(this);//删除鼠标监听
}
public void run()
{
Thread current=Thread.currentThread();
while(thread==current)
{
try
{
Thread.currentThread().sleep(delay);
}
catch(InterruptedException e)
{
}
repaint();
if(!bPause)
{
if(nOffset>=nPosXY.length)
{
for(int i=0;i<nPosXY.length-1;i++)
{
nPosXY[i]=nPosXY[i+1];
}
nPosXY[nPosXY.length-1]=(int)f(nOffset);
nOffset++;
}
}
}
}
double smooth()
{//平滑处理函数
int sum=0;
for(int i=0;i<nRand.length-1;i++)
nRand[i]=nRand[i+1];
if(bUp==0)
sum=rand.nextInt()%(alpha*getSize().height);
else if(bUp==1)
sum=(rand.nextInt()+(int)hold)%(alpha*getSize().height);
else if(bUp==2)
sum=(rand.nextInt()-(int)hold)%(alpha*getSize().height);
nRand[nRand.length-1]=sum;
for(int i=0;i<nRand.length-1;i++)
sum+=nRand[i];
sum/=nWindowWidth;
return -sum+getSize().height/2;
}
double f(double x)
{
double temp=0.0;
temp=smooth();
hold(temp);
if(temp<=0||temp>=getSize().height)
bPause=true;
return temp;
}
void hold(double x)
{//斜率控制
if(x==nMax&&bUp==0)
for(int i=0;i<nRand.length;i++)
{
nRand[i]+=hold;
bUp=1;
}
else if(x==nMin&&bUp==0)
for(int i=0;i<nRand.length;i++)
{
nRand[i]-=hold;
bUp=2;
}
else if(bUp==1)
for(int i=0;i<nRand.length;i++)
nRand[i]+=hold;
else if(bUp==2)
for(int i=0;i<nRand.length;i++)
nRand[i]-=hold;
// hold*=beta;
// hold*=1.2;
/* for(int i=0;i<nPosXY.length;i++)
{
if(nPosXY[i]==nMax)
{
x=i;
y=nPosXY[i];
bUp=true;
break;
}
}
for(int i=0;i<nPosXY.length;i++)
{
if(nPosXY[i]==nMin)
{
if(i<x)
{
x=i;
y=nPosXY[i];
bUp=false;
}
break;
}
}
while(x<nPosXY.length&&bUp)
{
x++;
nPosXY[x]=nPosXY[x-1]-(int)hold;
}
while(x<nPosXY.length&&!bUp)
{
x++;
nPosXY[x]=nPosXY[x-1]+(int)hold;
}*/
// return bUp;
}
public void paint(Graphics g)
{
// hold();//控制斜率
if(bFirst)
{
offG.clearRect(0,0,getSize().width,getSize().height);
offG.setColor(Color.red);
offG.drawLine(0,nMax-10,getSize().width,nMax-10);
offG.drawLine(0,nMin+10,getSize().width,nMin+10);
offG.setColor(Color.green);
for(int i=0;i<getSize().width-1;i++)
{
offG.drawLine(i,nPosXY[i],i+1,nPosXY[i+1]);
if(offG!=null)
g.drawImage(offImg,0,0,this);
}
bFirst=false;
}
else
{
g.clearRect(0,0,getSize().width,getSize().height);
offG.setColor(Color.red);
offG.drawLine(0,nMax-10,getSize().width,nMax-10);
offG.drawLine(0,nMin+10,getSize().width,nMin+10);
g.setColor(Color.green);
for(int i=0;i<getSize().width-1;i++)
g.drawLine(i,nPosXY[i],i+1,nPosXY[i+1]);
}
}
public void update(Graphics g)
{//重画
if(offG!=null)
{
paint(offG);//将备用屏幕上的图像画到当前屏幕
g.drawImage(offImg,0,0,this);
}
else
paint(g);
}
public void mouseEntered(MouseEvent e)
{//鼠标监听
bPause=true;//设置暂停
}
public void mouseExited(MouseEvent e)
{
bPause=false;//取消暂停
}
public void mouseReleased(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
public String getAppletInfo() {
return "测试绘图";
}
}