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

sim.app.mousetraps3d.MouseTraps3DWithUI 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.mousetraps3d;

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

public class MouseTraps3DWithUI extends GUIState
    {
    public JFrame displayFrame; 
        
    ValueGrid2DPortrayal3D trapsPortrayal = new ValueGrid2DPortrayal3D();
    ContinuousPortrayal3D ballPortrayal = new ContinuousPortrayal3D();
    WireFrameBoxPortrayal3D wireFrameP;

    public static void main(String[] args)
        {
        new MouseTraps3DWithUI().createController();
        }
        
    public MouseTraps3DWithUI() 
        { 
        super(new MouseTraps(System.currentTimeMillis(), 40.0,15,10,120.0,80.0,false)); 
        // ... or...
//      super(new MouseTraps(System.currentTimeMillis(), 3.9,100,100,10.0,10.0,false)); 
        }
    
    public static String getName() { return "3D Mouse Traps"; }
        
    public void start()
        {
        super.start();
        setup3DPortrayals();
        }
         
    public void load(SimState state)
        {
        super.load(state);
        // we now have new grids.  Set up the portrayals to reflect that
        setup3DPortrayals();
        }
            
    public void setup3DPortrayals()
        {       
        //display.destroySceneGraph();

        trapsPortrayal.setField(((MouseTraps)state).trapStateGrid);
        ballPortrayal.setField(((MouseTraps)state).ballSpace);
        ballPortrayal.setPortrayalForAll(new SpherePortrayal3D(Color.green));

        // rebuild the scene graph
        display.createSceneGraph();

        // reschedule the displayer
        display.reset();        
        }
        
    public Display3D display;
        
    public void init(Controller c)
        {
        super.init(c);
        
        /// Build the portrayals
        
        MouseTraps sim = (MouseTraps) state;
        trapsPortrayal.setField(sim.trapStateGrid);
        SimpleColorMap map = new SimpleColorMap();
        map.setLevels(0.0,1.0,Color.blue,Color.gray);
        trapsPortrayal.setPortrayalForAll(new TilePortrayal(map));

        // the trapsPortrayal is a grid portrayal.  These suckers by default have the
        // CENTER of their <0,0> grid element at the origin:
        //
        // C-------+-------+---
        // |       |       |
        // |   x   |       |  ...
        // |       |       | 
        // +-------+-------+
        // |       |
        // |  ...
        //
        // The center is marked with an x.  We want the origin to be at the CORNER
        // of the <0,0> grid element (marked with a C) so that the corner lines up
        // with the <0,0> position in the continuous wireframe space.  To do this
        // we need to translate the trapsPortrayal by 0.5 units in the x and y 
        // directions each (a grid element is 1 unit).
        
        trapsPortrayal.translate(0.5,0.5,0);
        
        // Now keep in mind that the grid elements are 1 unit each.  This is much
        // smaller scale than the continuous space.  We need to scale up the
        // trapsPortrayal so that one grid element is equal to the right number
        // of continuous space units.  The easiest way to do this is just to scale
        // by the ratio of their relative widths (or relative heights).
        
        trapsPortrayal.scale(sim.spaceWidth / sim.trapGridWidth);
        
        // Now we build the ball portrayal (the continuous3D space)
        ballPortrayal.setField(sim.ballSpace);

        // finally we'll build a wireframe around it all
        
        wireFrameP = new WireFrameBoxPortrayal3D(0,0,0,sim.spaceWidth, sim.spaceHeight, sim.spaceLength);

        // 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(trapsPortrayal,"Traps");
        display.attach(ballPortrayal, "Balls");
        display.attach(wireFrameP, "Fish tank");
        
        // translate the whole kit and caboodle into the center
        display.translate(-sim.spaceWidth/2, -sim.spaceHeight/2, -sim.spaceLength/2);
        // scale it down to some reasonable value, say, the maximal dimension of the boxes
        display.scale(1/Math.max(sim.spaceHeight, Math.max(sim.spaceWidth, sim.spaceLength)));

        displayFrame = display.createFrame();
        c.registerFrame(displayFrame);
        displayFrame.setVisible(true);
        }
        
    public void quit()
        {
        super.quit();

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy