java双缓冲区绘图,显示曲线动态变化,applet

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 "测试绘图";
 }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值