群体智能——粒子仿真系统

现版本粒子仿真系统主要由六个类组成,即界面,监听器,线程,粒子对象,数组队列。界面是最基本,没有特别的,这里不再赘述。


——线程

线程里面的死循环体负责不断产生粒子并加入导队列中,而且负责将队列里面的粒子画出。
这里我采用了缓冲区来对画出来的图像以及背景进行处理,因为我觉得通过不断重绘背景来对已经画出的粒子轨迹进行擦除,会让粒子效果看上去更好。

    //创建缓存区域
    BufferedImage buff;
    Graphics buffG;

我之前是将生成小球的死循环体写在监听器里面,但是出现了一个问题,监听器在不断运行,就不能触发窗体关闭的方法了,所以关闭不了窗口……然后将循环体放在线程里面,解决掉了这个问题。

@Override
public void run() {
    // TODO Auto-generated method stub
    //System.out.println("click");
    buff = new BufferedImage(2400,1200,BufferedImage.TYPE_4BYTE_ABGR);
    //获取缓存区域的画布
    buffG = buff.getGraphics();
    ImageIcon im = new ImageIcon(this.getClass().getResource("Sea.jpg"));
while(true)
    { //不断创建小球并添加到数组队列 
      cd c = new cd();
      c.g = g;
      c.x = a;
      c.y = b;
      MA.add(c);
    //画出背景图覆盖粒子轨迹
     buffG.drawImage(im.getImage(), 0, 0, 2400, 1200, null);
     //画出队列里面的小球
    for(int i=0;iif(MA.get(i)!=null){
     //小球的运动轨迹是基于上一个坐标而随机变化的
     MA.get(i).x += (int)(Math.pow((-1),(int)(Math.random()*2))*(int)(Math.random()*25));  
     MA.get(i).y += (int)(Math.pow((-1),(int)(Math.random()*2))*(int)(Math.random()*25));
    //小球的颜色也在随机变化
    Color co = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255),200);
    //先画在缓冲区
    buffG.setColor(co);
    buffG.fillOval(MA.get(i).x, MA.get(i).y, 10, 10);
    try{
        Thread.sleep(4);
    }catch(InterruptedException ef){
        }
    }
}
    //再将缓冲区的图像画到目标画布上
    g.drawImage(buff, 0, 0, null);
    try{
          Thread.sleep(20);
        }catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      }
    }   

——监听器

这里监听器MouseMotionListener的作用很简单,就只是用来获取鼠标移动的实时坐标,没有写其他方法

public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        x = e.getX();
        y = e.getY();
        //将坐标传给线程,改变小球位置
        thread.a = x;
        thread.b = y;

    }

其实核心就是上面两个类了,另外的数组队列,我自己写了一个接口,用来定义数组的方法,方便我添加小球(不用定义数组大小,直接改变),这个其实是之前学数组队列的时候用的,后来也就习惯了一直用自己写的这个接口,还没用过系统给的那个。

package GIS07;

public interface ArrList {


    //增加元素
    public void add(cd e);

    //获取元素
    public cd get(int index);

    //遍历输出元素
    public void reveal();

    //删除元素
    public void delete(int index);

    //修改元素
    public void update(int index,cd newValue);

    //获取大小
    public int size();


    //清空列表
    public void clear();

    //插入元素
    public void insert(int index,cd e);

    //合并列表
    public void union(ArrList list);

}

这个project的最终目标是实现粒子方针,有鱼群和捕食鱼群的大鱼,大鱼通过搜索鱼群的位置来移动,而鱼群也通过判断大鱼的方向和距离来移动,所以,未完待续……

你可能感兴趣的:(170625,粒子仿真系统)