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

sim.app.keepaway.Bot 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 Daniel Kuebrich
  Licensed under the Academic Free License version 3.0
  See the file "LICENSE" for more information
*/

// Class Bot
package sim.app.keepaway;
import java.awt.*;
import sim.portrayal.*;
import sim.util.*;
import sim.engine.*;

public /*strictfp*/ class Bot extends Entity implements Steppable
    {
    private static final long serialVersionUID = 1;

    public Bot( final double x, final double y, Color c)
        {
        super(x,y,2,c);
        }

    public void draw(Object object,  final Graphics2D g, final DrawInfo2D info )
        {
        // draw the circle
        super.draw(object, g,info);
        
        // draw our line as well
        
        final double width = info.draw.width * radius * 2;
        final double height = info.draw.height * radius * 2;
            
        g.setColor(Color.white);
        double d = velocity.angle();
        g.drawLine((int)info.draw.x,
            (int)info.draw.y,
            (int)(info.draw.x) + (int)(width/2 * /*Strict*/Math.cos(d)),
            (int)(info.draw.y) + (int)(height/2 * /*Strict*/Math.sin(d)));
        }


    public MutableDouble2D tempVector = new MutableDouble2D();
        
    public MutableDouble2D getForces( final Keepaway keepaway)
        {
        sumVector.setTo(0,0);
        Bag objs = keepaway.fieldEnvironment.getNeighborsWithinDistance(new Double2D(loc.x, loc.y), 100);

        double dist = 0;

        //http://www.martinb.com/physics/dynamics/collision/twod/index.htm
        double mass1;
        double mass2;

        for(int x=0; x dist)  // collision!
                    {
                    // 10% chance of kicking the ball, if it's a ball
                    // and kicking is not especially interesting.. its just accelerated impact
                    if(objs.objs[x] instanceof Ball && keepaway.random.nextDouble() < .1)
                        {
                        tempVector.subtract(((Entity)objs.objs[x]).loc, loc);
                        tempVector.normalize().multiplyIn(2.0);
                        ((Entity)objs.objs[x]).velocity.addIn(tempVector);
                        }
                    else        // else just ram it...
                        {               // shouldnt matter what type of object collision occurrs with
                        tempVector.x = 0;
                        tempVector.y = 0;
                        
                        mass1 = mass - ((Entity)objs.objs[x]).mass;
                        mass1 /= (mass + ((Entity)objs.objs[x]).mass);
                        
                        mass2 = 2 * ((Entity)objs.objs[x]).mass;
                        mass2 /= (mass + ((Entity)objs.objs[x]).mass);
                        
                        // self = object a
                        tempVector.x = velocity.x * mass1 + ((Entity)objs.objs[x]).velocity.x * mass2;
                        tempVector.y = velocity.y * mass1 + ((Entity)objs.objs[x]).velocity.y * mass2;
                        
                        // collided object = object 
                        ((Entity)objs.objs[x]).bump.x = velocity.x * mass2 - ((Entity)objs.objs[x]).velocity.x * mass1;
                        ((Entity)objs.objs[x]).bump.y = velocity.y * mass2 - ((Entity)objs.objs[x]).velocity.y * mass1;
                        
                        velocity.x = tempVector.x;
                        velocity.y = tempVector.y;
                        }
                    }
                else if(objs.objs[x] instanceof Ball)
                    {
                    // if we didn't hit the ball, we want to go towards it
                    tempVector.subtract(((Entity)objs.objs[x]).loc, loc);
                    tempVector.resize(0.5);
                    sumVector.addIn(tempVector);
                    }
                }
            }
        // bump forces
        sumVector.addIn(bump);
        bump.x = 0;
        bump.y = 0;
        return sumVector;
        }
 
        
    public void step( final SimState state )
        {
        Keepaway keepaway = (Keepaway)state;
        
        // get force
        final MutableDouble2D force = getForces(keepaway);
        
        // acceleration = f/m
        accel.multiply(force, 1/mass); // resets accel
        
        // v = v + a
        velocity.addIn(accel);
        capVelocity();
        
        // L = L + v
        newLoc.add(loc,velocity);  // resets newLoc
        
        // is new location valid?
        if(isValidMove(keepaway, newLoc))
            loc = newLoc;
        
        keepaway.fieldEnvironment.setObjectLocation(this, new Double2D(loc));
        }
    }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy