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

📄 graphs.java

📁 这是用遗传编程算法来拟合曲线的一个经典程序
💻 JAVA
字号:
/*作者:徐朝*/
/*keystonexu@yahoo.com.cn*/
package regression.gui;
import java.awt.*; 
import java.awt.event.*; 
import java.applet.*; 
import java.util.*; 
 
//一个通用绘图类,绘制曲线用 
public class Graphs extends Panel { 
  // 绘制类型:柱形,散点型,表达曲线型
  public final static int BAR = 0; 
  public final static int SCATTER = 1; 
 
  private int graphStyle; 
 
  /* 边距 */ 
  private final int leftGap = 2; 
  private final int topGap = 2; 
  private final int bottomGap = 2; 
  private int rightGap; // this value is computed  
 
  // 保存数据最小值,最大值
  private double min, max,max1; 
 
  //表示数据
  private double[] data;
  private double[] data1;   
 
  //使用的颜色,格子的颜色和数据的颜色
  Color gridColor = new Color(0, 150, 150); 
  Color dataColor = new Color(0, 0, 0); 
  
  // 用来按比例显示数据用 
  private int hGap;   // 数据点之间空间
  private int spread; // 最大最小值之差
  private double scale; // 比例
  private int baseline; // vertical coordinate of baseline 
  private String messageStr = "";
  private String messageStr1 = "";
  private String messageStr2 = "";
  // 在窗口中的位置
  private int top, bottom, left, right; 
 //传递来数据序列和显示格式
  public Graphs(double[] vals, double[] val, int style) { 
    // 关闭事件
    // resize事件
   /* addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent ce) { 
        repaint(); 
      } 
    }); */
 
    graphStyle = style; 
 
    data = vals; 
    data1 = val;
    //对数据排序,以求得最大最小值
    double t[] = new double[vals.length]; 
    System.arraycopy(vals, 0, t, 0, vals.length); 
    Arrays.sort(t); 
    min = t[0]; 
    max = t[t.length-1]; 
    max1 = t[t.length - 2];
    //设置窗口大小
    //setSize(new Dimension(200, 120)); 

    
  } 
 
  public void paint(Graphics g) { 
 
    Dimension winSize = getSize(); // 窗口大小
    
    g.setColor(Color.white);
    g.clearRect(0,0,getSize().width,getSize().height);
    
    
    Insets ins = getInsets(); // 边
 
    // 
    FontMetrics fm = g.getFontMetrics(); 
 
    // 计算右边的距离 
    rightGap = fm.stringWidth("" + data.length); 
 
    //计算整个数据区
    left = ins.left + leftGap + fm.charWidth('0'); 
    top = ins.top + topGap + fm.getAscent(); 
    bottom = ins.bottom + bottomGap + fm.getAscent(); 
    right = ins.right + rightGap; 
 
    if(min > 0) min = 0; 
    if(max < 0) max = 0; 
 
    /* 计算最大最小值间距离. */ 
    spread = (int) (max - min); 
    if(spread < 1)
       spread = 1;
    // 计算缩放比例
    scale = (double) (winSize.height - bottom - top) / spread; 

    //计算x轴
    baseline = (int) (winSize.height - bottom + min * scale);  
 
    // 计算数据间距
    hGap = (winSize.width - left - right) / (data.length-1); 
 
    //设置格子颜色
    g.setColor(gridColor); 
  
    //画x轴
    g.drawLine(left, baseline, 
               left + (data.length-1) * hGap, baseline); 
 
    //绘制y轴
    if(graphStyle != BAR) 
      g.drawLine(left, winSize.height-bottom, left, top); 
 
    //显示最小,最大值
    g.drawString("0", ins.left, baseline+fm.getAscent()/2);
    //绘制坐标值
    for(int i = 1; i < 10; i++)
    {
    	String data =(new Double(i * 0.1)).toString().substring(0,3);
    	g.drawString(data,hGap * i + ins.left - 8,baseline + 14);
    	g.drawLine(hGap * i,baseline,hGap * i,baseline - 3);
    	
    } 
 
    if(max != 0) 
      g.drawString("" + max, ins.left, baseline - 
                   (int) (max*scale) - 4); 
    if(max1 != 0)
      g.drawString(("" + max1).substring(0,5),ins.left,baseline- (int)(max1 * scale) -4);
    if(min != 0) 
      g.drawString(("" + min).substring(0,5), ins.left, baseline - 
                   (int) (min*scale)+fm.getAscent()); 
    g.setFont(new Font("宋体",Font.PLAIN,20));
    g.drawString(messageStr, 100,30);
    g.setFont(new Font("宋体",Font.PLAIN,16));
    g.drawString(messageStr1, 100,55);    
    // 设置数据颜色
    g.setColor(dataColor); 
 
    //绘制数据
    switch(graphStyle) { 
      case BAR: 
        bargraph(g); 
        break; 
      case SCATTER: 
        scatter(g,Color.black,data); 
        if(data1 != null)
            scatter(g,Color.blue,data1); 
        break; 

    } 
  } 

  public void setData(double data1[],double adjustedFitness,
   int currentGeneration)
  {
  	this.data1 = data1;
  	messageStr = "第 " + currentGeneration + " 代";
  	messageStr1 = "adjusted适应度:  " +  adjustedFitness ;
  	repaint();
  	
  }

  // 绘制直线型
  private void bargraph(Graphics g) { 
    int v; 
    for(int i=0; i < data.length; i++) {
      v = (int) (data[i] * scale); 
      g.drawLine(i*hGap+left, baseline, 
                 i*hGap+left, baseline - v); 
    } 
  } 
 
  // 绘制散点
  private void scatter(Graphics g,Color color,double[] data) { 
    int v; 
    int oldx,oldy,x1,y1;
    oldx = left;
    oldy = baseline - (int) (data[0] * scale);
    g.setColor(color);
    for(int i=0; i < data.length; i++) 
    { 
      v = (int) (data[i] * scale);  
      int x = i * hGap + left;
      int y = baseline - v;   
      g.fillRect(x, y, 6, 6);
      g.drawLine(oldx,oldy,x,y);
      oldx = x;
      oldy = y;
    }
    
     
  } 
 

}

⌨️ 快捷键说明

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