?? graphapplet.java
字號:
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)//如果thread是當前線程的話
{
try
{
Thread.currentThread().sleep(delay);
}
catch(InterruptedException e)
{ }
repaint();//調用update方法,update方法再調用paint()方法
if(!bPause)//如果是暫停標志是false
{
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 "測試繪圖";
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -