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

📄 sampleqnanimation.java

📁 一个用于排队系统仿真的开源软件,有非常形象的图象仿真过程!
💻 JAVA
字号:
/**    
  * Copyright (C) 2006, Laboratorio di Valutazione delle Prestazioni - Politecnico di Milano

  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.

  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.

  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
  
package jmt.gui.common.startScreen.sampleAnimation;

import jmt.gui.common.animation.*;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;

/**
 * Created by IntelliJ IDEA.
 * User: OrsotronIII
 * Date: 2-mar-2005
 * Time: 19.02.36
 * To change this template use Options | File Templates.
 */
public class SampleQNAnimation extends QueueNetAnimation{

    //Thread controller that repaints animation.
    Animator controller;

    public SampleQNAnimation(){
        super(new SampleIconsToolkit());
        setBounds(new Rectangle(198,98));
        prepareQueueNet();
    }

    private void prepareQueueNet(){
        int x=16, y=-3;
        Point[][] linkPts={{new Point(70+x,60+y),new Point(90+x,60+y),new Point(90+x,75+y),new Point(100+x,75+y)},
                           {new Point(70+x,60+y),new Point(90+x,60+y),new Point(90+x,40+y),new Point(100+x,40+y)},
                           {new Point(140+x,40+y),new Point(150+x,40+y),new Point(150+x,95+y),new Point(15+x,95+y),new Point(15+x,60+y),new Point(30+x,60+y)},
                           {new Point(140+x,75+y),new Point(150+x,75+y),new Point(150+x,95+y),new Point(15+x,95+y),new Point(15+x,60+y),new Point(30+x,60+y)},
                           {new Point(70+x,60+y),new Point(80+x,60+y),new Point(80+x,35+y),new Point(20+x,35+y),new Point(20+x,60+y),new Point(30+x,60+y)}};
        ColoredStationAnimation[] stations = {new ColoredStationAnimation(new Point(120+x,40+y), 500),
                                              new ColoredStationAnimation(new Point(50+x,60+y), 100),
                                              new ColoredStationAnimation(new Point(120+x,75+y), 500)};
        for(int i=0; i<stations.length; i++) addStation(stations[i]);
        EdgeAnimation[] links = new EdgeAnimation[linkPts.length];
        for(int i=0; i<linkPts.length; i++) links[i] = new EdgeAnimation(linkPts[i], 20);
        ColoredStationAnimation[] sourceStations = {stations[1],stations[1],stations[0],stations[2],stations[1]};
        ColoredStationAnimation[] targetStations = {stations[2],stations[0],stations[1],stations[1], stations[1]};
        for(int i=0; i<links.length; i++) addEdge(links[i], sourceStations[i], targetStations[i]);
        for(int i=0; i<10; i++){
                addJob(new JobAnimation(0.075,
                                    new JobPath[]{new RandomPath(this, stations[i%stations.length])},
                                    new Rectangle(6,6),new SampleIconsToolkit()),
                        stations[i%stations.length]);
        }
        controller = new Animator(30, this);
    }

    public void start(){
        controller.start();
    }

    public void stop(){
        controller.terminate();
    }


}

class ColoredStationAnimation extends StationAnimation{


    private static Color[] colors = {new Color(255,0,0,150),
                                     new Color(0,255,0,150),
                                     new Color(0,0,0,150),
                                     new Color(255,255,0,150),
                                     new Color(0,0,255,150)
    };

    private double cpuPhase = Math.random()*360,
                queuePhase = Math.random()*16;
    private int colorPhase = (int)(Math.random()*colors.length),
                jobLength = 6;

    private Image overlayedShading=null;

    public ColoredStationAnimation(Point location, long residenceTime){
        super("server", new Rectangle(location.x-20, location.y-10, 40, 20), residenceTime);
        createOverlayImage();
    }

    public void paint(Graphics g, ImageObserver io){
        createQueue(g);
        createCPU(g);
        g.drawImage(this.overlayedShading,getBounds().x,getBounds().y,io);
    }

    private void createOverlayImage(){
        int height = getBounds().height*2,
                width=getBounds().width*2,
                qLength = width-(height*4)/5,
                qHeight = (height*4)/5,
                yOffs = (height-qHeight)/2;
        overlayedShading = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
        Color[] shades = new Color[7], lights = new Color[7];
        for(int i=0; i<shades.length; i++){
            shades[i] = new Color(0,0,0, 160-(i*160)/shades.length);
            lights[i] = new Color(255,255,255, 200-(i*200)/lights.length);
        }
        Graphics g = overlayedShading.getGraphics();
        for(int i=0; i<shades.length;i++){
            g.setColor(lights[i]);
            g.drawPolyline(new int[]{i,i,qLength-i}, new int[]{height-i-yOffs,i+yOffs,i+yOffs}, 3);
            g.drawArc(width-height+i,i,height-2*i,height-2*i,45+4*i,180-8*i);
            g.setColor(shades[i]);
            g.drawPolyline(new int[]{i,qLength-i,qLength-i}, new int[]{height-i-yOffs,height-i-yOffs,i+yOffs}, 2);
            g.drawArc(width-height+i,i,height-2*i,height-2*i,225+4*i,180-8*i);
        }
        overlayedShading = overlayedShading.getScaledInstance(getBounds().width,getBounds().height,Image.SCALE_SMOOTH);
    }

    private void createCPU(Graphics g){
        cpuPhase = (cpuPhase-6)%360;
        int width=getBounds().width,
                height=getBounds().height,
                x=getBounds().x,
                y=getBounds().y,
                turn=colors.length;
        g.setColor(Color.WHITE);
        g.fillOval(width-height+x+1, y+1, height-2, height-2);
        for(int i=0; i<turn; i++){
            g.setColor(colors[i%colors.length]);
            g.fillArc(width-height+x,y,height,height, (int)cpuPhase+(i*360)/turn, 360/turn);
        }
    }

    private void createQueue(Graphics g){
        queuePhase = queuePhase+1;
        if(queuePhase>jobLength){
            queuePhase = queuePhase-jobLength;
            colorPhase = (colorPhase+colors.length-1)%colors.length;
        }
        int width=getBounds().width,
                height=getBounds().height,
                x=getBounds().x,
                y=getBounds().y,
                turn=(width-(height*4)/5),
                qHeight = (height*4)/5,
                yOffs = (height-qHeight)/2;
        for(int i=0, col=colorPhase, offsX = (int)queuePhase;
            offsX <= turn+queuePhase;
            i++, col=(col+1)%colors.length, offsX+=jobLength){
            g.setColor(colors[col]);
            int offs = offsX - jobLength;
            if(i==0)offs = offsX - (int)queuePhase;
            g.fillRect(x+offs, y+yOffs, offsX-offs, qHeight);
        }
    }
}

class SampleIconsToolkit extends DefaultIconsToolkit{

    private static Color[] colors = {new Color(255,0,0,150),
                                     new Color(255,255,0,150),
                                     new Color(0,0,255,150),
                                     new Color(100,100,100,150),
                                     new Color(0,255,0,150)
    };



    public Image getJobIcon(Rectangle bounds){
        BufferedImage bi = new BufferedImage(100,100,BufferedImage.TYPE_4BYTE_ABGR);
        Graphics jig = bi.getGraphics();
        Color col= colors[(int)(colors.length*Math.random())];
        int red=(255-col.getRed())*2/5+col.getRed(),
                green=(255-col.getGreen())*2/5+col.getGreen(),
                blue=(255-col.getBlue())*2/5+col.getBlue();
        Color[] colGradient = new Color[10];
        //Build a color gradient from black to selected color
        for(int i=0; i<colGradient.length; i++){
            colGradient[i]= new Color(channelGradient(i, colGradient.length, red),
                    channelGradient(i, colGradient.length, green),
                    channelGradient(i, colGradient.length, blue));
        }
        for(int i=0; i<colGradient.length; i++){
            jig.setColor(colGradient[i]);
            jig.fillOval(i*3,i*3,100-(i*9), 100-(i*9));
        }
        return bi.getScaledInstance(bounds.width, bounds.height,Image.SCALE_SMOOTH);
    }

    private int channelGradient(int x, int rangeX, int rangeY){
        return (int)(rangeY*Math.pow((double)(x)/rangeX, 0.44));
    }

    public Image getBGTileIcon(Rectangle bounds){
        BufferedImage bi = new BufferedImage(bounds.width,  bounds.height, BufferedImage.TYPE_4BYTE_ABGR);
        Graphics g = bi.getGraphics();
        g.setColor(new Color(150,150,150,200));
        g.fillRect(0,0, bounds.width, bounds.height);
        return bi;
    }

}


⌨️ 快捷键说明

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