All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sim.app.heatbugs3d.HeatBugs3DWithUI Maven / Gradle / Ivy

Go to download

MASON is a fast discrete-event multiagent simulation library core in Java, designed to be the foundation for large custom-purpose Java simulations, and also to provide more than enough functionality for many lightweight simulation needs. MASON contains both a model library and an optional suite of visualization tools in 2D and 3D.

The newest version!
/*
  Copyright 2006 by Sean Luke and George Mason University
  Licensed under the Academic Free License version 3.0
  See the file "LICENSE" for more information
*/

package sim.app.heatbugs3d;

import sim.engine.*;
import sim.display.*;
import sim.display3d.*;
import sim.portrayal3d.*;
import sim.portrayal3d.simple.*;
import sim.portrayal3d.grid.*;
import sim.portrayal3d.grid.quad.*;
import sim.app.heatbugs.*;
import sim.util.gui.*;
import java.awt.*;
import javax.swing.*;

/**
 * @author Gabriel Catalin Balan
 *
 * This is a HeatBugs view. 
 *      -the bugs can be displayed STACKED or CLASSIC way (only one shown 
 *       when more on top of one another).
 *      -the heat is both color and altitude coded. You can turn off
 *   altitudes by using NOZ.      
 */
public class HeatBugs3DWithUI extends GUIState
    {
                
    public JFrame displayFrame; 
    public static final int CLASSIC = 0;
    public static final int STACKED = 1;
        
    public static final int TILE = 0;
    public static final int MESH = 1;
    public static final int NOZ  = 2;

    int heatmode = MESH;

       
    ValueGrid2DPortrayal3D heatPortrayal = new ValueGrid2DPortrayal3D();        
    FieldPortrayal3D bugPortrayal = null;
    QuadPortrayal quadP = null;
     
    public static void main(String[] args)
        {
        HeatBugs3DWithUI heatbugs = 
            new HeatBugs3DWithUI(       new HeatBugs( System.currentTimeMillis(),
                    100,100,100),
                HeatBugs3DWithUI.STACKED, 
//                                      HeatBugs3DWithUI.CLASSIC,
                                         
//                                      HeatBugs3DWithUI.TILE);
//                                      HeatBugs3DWithUI.NOZ);
                HeatBugs3DWithUI.MESH);
                                                                                                                
        Console c = new Console(heatbugs);
        c.setVisible(true);        
        }

    public HeatBugs3DWithUI() 
        { 
        this(new HeatBugs(System.currentTimeMillis()), STACKED, MESH); 
        }

    public HeatBugs3DWithUI(SimState state, final int bugmode, final int heatmode)
        {
        super(state); 
        this.heatmode = heatmode;

        // Here we define the bugPortrayal so it can be attached in init().  Otherwise
        // if we defined it in start(), we'd have to detatch the bugPortrayal and reattach
        // a new one, which is kinda dorky.
        //
        // The particular heatmode can be done in start() without any trouble.
        if (bugmode == STACKED)
            bugPortrayal = new SparseGrid2DPortrayal3D();
        else // if bugmode == CLASSIC
            bugPortrayal = new SparseGridPortrayal3D();
        }

    public static String getName()
        {
        return "3D HeatBugs";
        }
    
    public void start()
        {
        super.start();
        setupPortrayals();
        }
     
    public void load(SimState state)
        {
        super.load(state);
        // we now have new grids.  Set up the portrayals to reflect that
        setupPortrayals();
        }
        
    public void setupPortrayals()
        {
        // display.destroySceneGraph();

        // determine 
        SimpleColorMap cm = new SimpleColorMap();
        cm.setLevels(0.0,HeatBugs.MAX_HEAT,Color.blue,Color.red);
                
        // specify that the "bugs" are going to be cones pointing straight up.
        TransformedPortrayal3D p = new TransformedPortrayal3D(new ConePortrayal3D());
        p.rotateX(90.0);
        bugPortrayal.setPortrayalForAll(p);
        
        // the heat can be tiles, meshes, or tiles with no change in height (NOZ).
        // Specify which one here.
        switch(heatmode)
            {
            case TILE : quadP = new TilePortrayal(cm, 1f/2000); break;
            case MESH : quadP = new MeshPortrayal(cm, 1f/2000); break;
            case NOZ :  
                quadP = new TilePortrayal(cm);   // no height changes, but we need to raise the bugs a little bit
                bugPortrayal.translate(0,0,1.0f);
                break;
            default:
                throw new RuntimeException("default case should never occur");
            }
        heatPortrayal.setPortrayalForAll(quadP);
// With this line we can tell the bug portrayal to use two triangles rather than
// a rect to draw each cell.  See the documentation for ValueGrid2DPortrayal3D for
// why this would be useful and when it is not.
//      heatPortrayal.setUsingTriangles(true);


        heatPortrayal.setField(((HeatBugs)state).valgrid);
        bugPortrayal.setField(((HeatBugs)state).buggrid);


        // reschedule the displayer
        display.reset();        

        // rebuild the scene graph
        display.createSceneGraph();
        }
    
    public Display3D display;

    public void init(Controller c)
        {
        super.init(c);
        // Make the Display3D.  We'll have it display stuff later.
        display = new Display3D(600,600,this);
                
        // attach the portrayals to the displayer, from bottom to top
        display.attach(heatPortrayal,"Heat");
        display.attach(bugPortrayal, "Bugs");
        heatPortrayal.setValueName("Heat");
                
        HeatBugs hbState = (HeatBugs)state;
        
        // center the bug graph.  Right now it's located at the (0,0) position.  For
        // example, if it's a 5x5 graph, and the origin is at (0,0), we want to move it
        // to (2,2).  So we want it to be at (  (5-1)/2 = 2,  (5-1/2) = 2  ).  Similarly,
        // if it's a 6x6 graph we want the origin to be at (2.5, 2.5), dead center between
        // the (2,2) and (3,3) grid positions.  To center
        // the origin there, we need to move the graph in the opposite direction.
        // so the general equation for each dimension: (numGridPoints - 1) / -2.0.
        display.translate((hbState.gridWidth - 1)/-2.0, (hbState.gridHeight - 1)/-2.0, 0);
        
        // now let's scale it so it fits inside a 1x1x1 cube centered at the origin.  We don't
        // have to, but it'll look nicer.
        display.scale(1.0/Math.max(hbState.gridWidth,hbState.gridHeight));
        
        displayFrame = display.createFrame(); 
        c.registerFrame(displayFrame);   // register the frame so it appears in the "Display" list
        displayFrame.setVisible(true);
        }
        
    public void quit()
        {
        super.quit();

        if (displayFrame!=null) displayFrame.dispose();
        displayFrame = null;  
        display = null;       
        }


    }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy