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

sim.app.mousetraps.Ball 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.mousetraps;
import sim.util.*;
import sim.engine.*;

public class Ball implements Steppable
    {
    private static final long serialVersionUID = 1;

    public double posX, posY, posZ;
    public double velocityX, velocityY, velocityZ;
        
    public Ball( double x, double y, double z, double vx, double vy, double vz) 
        {
        this.posX = x;
        this.posY = y;
        this.posZ = z;
        this.velocityX = vx;
        this.velocityY = vy;
        this.velocityZ = vz;
        }
            
    public void step( final SimState state )
        {
        MouseTraps sim = (MouseTraps)state;
        if(posZ <=0 && velocityZ <=0)
            {
            sim.schedule.scheduleOnce(sim.schedule.getTime()+1,new MouseTrap(sim.discretizeX(posX),sim.discretizeY(posY)));
            sim.ballSpace.remove(this);
            return;
            }
        double timeStepDuration = MouseTraps.TIME_STEP_DURATION;
        posX +=velocityX * timeStepDuration;
        posY +=velocityY * timeStepDuration;
        posZ +=velocityZ * timeStepDuration;
        velocityZ -= MouseTraps.GRAVITY_ACC * timeStepDuration;
        
        if(sim.toroidalWorld)
            {//wrap around
            posX = (posX + sim.spaceWidth)% sim.spaceWidth;
            posY = (posY + sim.spaceHeight)%sim.spaceHeight;
            //you don;t want wrap-around the Z axis; and anyway
            //dont forget that the ceiling is computed so that no 
            //ball can jumb higher than that; 
            }
        else
            {//bounce off the walls
            if(posX >sim.spaceWidth)
                {
                posX = sim.spaceWidth;  velocityX = -velocityX;
                }
            if(posX < 0)
                {
                posX = 0;                               velocityX = -velocityX;
                }
            if(posY >=sim.spaceHeight)
                {
                posY = sim.spaceHeight; velocityY = -velocityY;
                }
            if(posY < 0)
                {
                posY = 0;                               velocityY = -velocityY;
                }
            }
        sim.ballSpace.setObjectLocation(this,new Double3D(posX,posY,posZ));
        sim.schedule.scheduleOnce(this);
        }
        
    }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy