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

📄 mountainc.java

📁 这是一个java程序
💻 JAVA
字号:
// 3D painted fractal mountains,  Evgeny Demidov  12 Oct 2001
import java.awt.*;
import java.awt.event.*;
import java.util.StringTokenizer;
public class MountainC extends java.applet.Applet
    implements MouseListener, MouseMotionListener {
  int n = 256, n1,  h,w,h2,w2, mx0,my0,  xPol[],yPol[], iCol[][][];
  double rnd,  fiX = .2, fiY = .3, dfi = .01, scale = .8, m20,m21,m22;
  double vert[][][], vert1[][][], Norm[][][][], Norm1z[][][], M[];
  Image buffImage;     Graphics buffGraphics;
  Color col[][];
  boolean painted;
  
  
  
  
  
  
/*******************************************************************
 * 以下为初始化方法
 *******************************************************************/ 
public void init(){
	resize(1200, 700);                        //设置显示窗口的高宽度
  w = getSize().width;  h = getSize().height; //得到高宽度,w为宽,h为高
  w2 = w/2;  h2 = h/2;                        //w2,h2分别为宽高的二分之一
  String s=getParameter("N");                //返回 HTML 标记中指定参数的值
  if (s != null) 
	  n = Integer.parseInt(s);               //如果HTML标记中存在此参数,则使之变成整数
                                             //它原来是用于表示一个表示的次数,不是怎样的,小的时候山出少
  xPol = new int[3];                         
  yPol = new int[3];                         //xPol、yPol分别为长为3的数组
  buffImage = createImage(w, h);             //创建一幅用于双缓冲的、可在屏幕外绘制的图像
  buffGraphics = buffImage.getGraphics();    //得到可画的面板
  
  
  //***************************************************************************
  col = new Color[4][256];                   //得到一个颜色的数组,并在下面循环中给定初值
  for (int i = 0; i < 256; i++){
    col[0][i] = new Color(0, 0, i);
    col[1][i] = new Color(0, (i*220)/256, 0);
    col[2][i] = new Color((i*150)/256, (i*150)/256, (i*50)/256);//创建具有指定红色、绿色和蓝色值的不透明的 sRGB 颜色,这些值都在 (0 - 255) 的范围内
    col[3][i] = new Color(i, i, i);}
  //******************************************************************************
  
  
  s = getParameter("bgColor"); //得到背影的的颜色 
  
  if (s != null){
     StringTokenizer st = new StringTokenizer(s);
     int red = Integer.parseInt(st.nextToken());
     int green = Integer.parseInt(st.nextToken());
     int blue = Integer.parseInt(st.nextToken());
     setBackground( new Color(red, green, blue));}
  else
	  setBackground(new Color(255,255,255));//设置背影颜色为白色
      addMouseListener(this);               //增加自己的监听器
      addMouseMotionListener(this);         //增加自己为监听器
      setup();                              //开始调用下面的setup()方法                             
}









/************************************************************************************
 * 以下为setup方法
 ************************************************************************************/
public void setup(){
  rnd = 1;
  n1 = n+1;                                  
  iterate();
  vert = new double[n1][n1][3];               //令n1=n+1好像是要运行n次,因为可以保存这么多的数据,而且是三维的呢
  vert1 = new double[n1][n1][2];
  double dx = w/(double)n;                    //宽度除以n,有什么用意呢
  int t = 0;
  
  //****************************************************
  for (int i = 0; i < n1; i++)   //n1=n+1
   for (int j = 0; j < n1; j++)  //n1=n+1
   {//********w2为w/2,也就是w2为中心点
    vert[i][j][0] = dx*i - w2;    //dx为w/n,也就是每一份有多少个像素
    vert[i][j][2] = dx*j - w2;
    double mi = M[t++];
    if (mi < 0)
    	mi = .01*Math.random();
    vert[i][j][1] = w*mi - w2/2;
   }
  //******************************************************
  
    Norm = new double[n1][n1][2][3]; 
    Norm1z = new double[n1][n1][2];
    iCol = new int[n][n][2];
  for (int i = 0; i < n; i++)
   for (int j = 0; j < n; j++){
	   
     double s =
      ((vert[i][j][1] + vert[i+1][j][1] + vert[i+1][j+1][1])/3 + w2/2)/w;
     if (s < .01) iCol[i][j][0] = 0;
     else if (s+.1*Math.random() > .35) iCol[i][j][0] = 3;
      else if (s+.1*Math.random() > .15)  iCol[i][j][0] = 2;
       else  iCol[i][j][0] = 1;
     
     
     s = ((vert[i][j][1] + vert[i][j+1][1] + vert[i+1][j+1][1])/3 + w2/2)/w;
     if (s < .01) iCol[i][j][1] = 0;
     else if (s+.1*Math.random() > .35) iCol[i][j][1] = 3;
      else if (s+.1*Math.random() > .15)  iCol[i][j][1] = 2;
       else  iCol[i][j][1] = 1;
     
     
    Norm[i][j][0][0] = vert[i][j][1] - vert[i+1][j][1];
    Norm[i][j][0][1] = dx;
    Norm[i][j][0][2] = vert[i+1][j][1] - vert[i+1][j+1][1];
    double mod = Math.sqrt(Norm[i][j][0][0]*Norm[i][j][0][0] + Norm[i][j][0][1]*
     Norm[i][j][0][1] + Norm[i][j][0][2]*Norm[i][j][0][2]) / 255.5;
    
    Norm[i][j][0][0] /= mod;
    Norm[i][j][0][1] /= mod; 
    Norm[i][j][0][2] /= mod;
    
    Norm[i][j][1][0] = vert[i][j+1][1] - vert[i+1][j+1][1];
    Norm[i][j][1][1] = dx;
    Norm[i][j][1][2] = vert[i][j][1] - vert[i][j+1][1];
    mod = Math.sqrt(Norm[i][j][1][0]*Norm[i][j][1][0] + Norm[i][j][1][1]*
          Norm[i][j][1][1] + Norm[i][j][1][2]*Norm[i][j][1][2]) / 255.5;
    
    Norm[i][j][1][0] /= mod;
    Norm[i][j][1][1] /= mod;
    Norm[i][j][1][2] /= mod;
    }
  
  rotate();
}

public void rotate(){
	  double ct = Math.cos(fiX), cf = Math.cos(fiY),
	         st = Math.sin(fiX), sf = Math.sin(fiY),
	         m00 =  scale*cf,    m02 =  scale*sf,
	         m10 = scale*st*sf, m11 =  scale*ct, m12 = -scale*st*cf;
	         m20 = -ct*sf; m21 = st; m22 = ct*cf;
	  for (int i = 0; i < n1; i++)
	   for (int j = 0; j < n1; j++){
	    vert1[i][j][0] = m00*vert[i][j][0] + m02*vert[i][j][2];
	    vert1[i][j][1] = m10*vert[i][j][0] + m11*vert[i][j][1] + m12*vert[i][j][2];}
	  for (int i = 0; i < n; i++)
	   for (int j = 0; j < n; j++)
	    for (int k = 0; k < 2; k++)
	     Norm1z[i][j][k] = m20*Norm[i][j][k][0] + m21*Norm[i][j][k][1] +
	      m22*Norm[i][j][k][2];
	  painted = false;
	}



/*****************************************************************
 * 以下为iterate函数
 ******************************************************************/
public void iterate(){
  int nc=n, Max=n1*n1, ncn1;   //Max=n1*n1为什么意思呢,它要用了两倍数这么多
  double Min=-1;               //最小值为-1
  M = new double[Max];         //它生成一个长为Max的数组
  for (int i=n+2; i < n*n1-1; i++) M[i] = Min;
  for (int i=2*n1; i < n*n1; i += n1) M[i] = M[i-1] = 0;
  
  
  
  
  while ( (nc /= 2) >= 1){     //初始时nc为n,因而怀疑为书上的生成规则
      ncn1 = nc*n1;            //nc原来为n
      for (int j=ncn1; j < Max; j += ncn1+ncn1)
       {
    	  
        for (int i= nc; i < n; i += nc+nc)
         {
         if (M[i+j]==Min)//center
            M[i+j] = (M[i+j+nc-ncn1] + M[i+j-nc+ncn1])/2.+R();
         if (M[i+j+nc]==Min)//right
            M[i+j+nc] = (M[i+j+nc+ncn1] + M[i+j+nc-ncn1])/2.+R();
         if (M[i+j+ncn1]==Min)//buttom
            M[i+j+ncn1] = (M[i+j-nc+ncn1] + M[i+j+nc+ncn1])/2.+R(); 
         }
      
        }
    rnd /= 2.;//rnd为double型的,每次重复一次就减
  }
  
  
  
  
  
  
  
}

public double R(){ return rnd*(Math.random()-.5);}//得到一个随机数













































































































public void destroy() {
  removeMouseListener(this);
  removeMouseMotionListener(this);
}
public void mouseClicked(MouseEvent e){}       // event handling
public void mousePressed(MouseEvent e) {
  mx0 = e.getX();  my0 = e.getY();
  if ( e.isControlDown() ){
    setup();
    repaint();}
  if ( e.isAltDown() ){
    if ( e.isShiftDown() ){ n /= 2;  if (n < 1) n = 1;}
    else n *= 2;
    setup();
    repaint();}
  e.consume();
}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e)  {}
public void mouseDragged(MouseEvent e) {
  int x1 = e.getX();  int y1 = e.getY();
  if ( e.isShiftDown() )  scale *= Math.exp(-(y1 - my0)/(double)w);
  else   fiX += dfi*(y1 - my0);
  fiY += dfi*(x1 - mx0);   mx0 = x1;  my0 = y1;
  rotate();
  repaint();
  e.consume();
}



public void mouseMoved(MouseEvent e) {}

public void paint(Graphics g) {
 if ( !painted ){
  buffGraphics.clearRect(0, 0, w, h);
  int ib=0, ie=n, sti=1,  jb=0, je=n, stj=1;
  if (m20 < 0){ ib = n; ie = -1; sti = -1;}
  if (m22 < 0){ jb = n; je = -1; stj = -1;}
  for (int i = ib; i != ie; i += sti)
   for (int j = jb; j != je; j += stj){
    if (Norm1z[i][j][0] > 0){
     xPol[0] = w2 + (int)vert1[i][j][0];
     xPol[1] = w2 + (int)vert1[i+1][j][0];
     xPol[2] = w2 + (int)vert1[i+1][j+1][0];
     yPol[0] = h2 - (int)vert1[i][j][1];
     yPol[1] = h2 - (int)vert1[i+1][j][1];
     yPol[2] = h2 - (int)vert1[i+1][j+1][1];
     buffGraphics.setColor(col[iCol[i][j][0]][(int)(Norm1z[i][j][0])]);
     buffGraphics.fillPolygon(xPol,yPol, 3);}
    if (Norm1z[i][j][1] > 0){
     xPol[0] = w2 + (int)vert1[i][j][0];
     xPol[1] = w2 + (int)vert1[i][j+1][0];
     xPol[2] = w2 + (int)vert1[i+1][j+1][0];
     yPol[0] = h2 - (int)vert1[i][j][1];
     yPol[1] = h2 - (int)vert1[i][j+1][1];
     yPol[2] = h2 - (int)vert1[i+1][j+1][1];
     buffGraphics.setColor(col[iCol[i][j][1]][(int)(Norm1z[i][j][1])]);
     buffGraphics.fillPolygon(xPol,yPol, 3);} }
  painted = true;}
 g.drawImage(buffImage, 0, 0, this);
 showStatus( "n=" + n);
}
public void update(Graphics g){ paint(g); }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -