/*
* Datei: PanicEnvironment.java
* Autor(en): Lukas König, Daniel Pathmaperuma
* Java-Version: 6.0
* Erstellt: 2010_10_28
*
* (c) This file and the EAS (Easy Agent Simulation) framework containing it
* is protected by Creative Commons by-nc-sa license. Any altered or
* further developed versions of this file have to meet the agreements
* stated by the license conditions.
*
* =========================================================================
* Copyright note from phys2D:
*
* Phys2D - a 2D physics engine based on the work of Erin Catto.
*
* This source is also provided under the terms of the BSD License.
*
* Copyright (c) 2006, Phys2D
* All rights reserved.
*
* Where the licenses differ from each other, the more restrictive license
* version has to be concerned.
* =========================================================================
*
* In a nutshell (for the EAS framework)
* -------------
* You are free:
* - to Share - to copy, distribute and transmit the work
* - to Remix - to adapt the work
*
* Under the following conditions:
* - Attribution -- You must attribute the work in the manner specified by the
* author or licensor (but not in any way that suggests that they endorse
* you or your use of the work).
* - Noncommercial -- You may not use this work for commercial purposes.
* - Share Alike -- If you alter, transform, or build upon this work, you may
* distribute the resulting work only under the same or a similar license to
* this one.
*
* + Detailed license conditions (Germany):
* http://creativecommons.org/licenses/by-nc-sa/3.0/de/
* + Detailed license conditions (unported):
* http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en
*
* This header must be placed in the beginning of any version of this file.
*/
package eas.users.demos.panicSimulation;
import java.util.Random;
import eas.math.geometry.Vector2D;
import eas.simulation.Wink;
import eas.simulation.event.EASEvent;
import eas.simulation.spatial.sim2D.physicalSimulation.physicsEngine.AgentList;
import eas.simulation.spatial.sim2D.physicalSimulation.physicsEngine.net.phys2d.math.Vector2f;
import eas.simulation.spatial.sim2D.physicalSimulation.standardAgents.PhysicsAgent2D;
import eas.simulation.spatial.sim2D.physicalSimulation.standardEnvironments.PhysicsEnvironment2D;
import eas.startSetup.ParCollection;
/**
* @author Lukas König
*
*/
public class PanicEnvironment extends PhysicsEnvironment2D<PhysicsAgent2D<?>> {
/**
*
*/
private static final long serialVersionUID = -6761572293763306130L;
private ParCollection pars;
/**
* @param ident
* @param params
* @param gravity
* @param iterations
*/
public PanicEnvironment(
int ident,
ParCollection params,
Vector2f gravity,
int iterations) {
super(ident, params, gravity, iterations);
if (params != null) {
pars = params;
this.rand = new Random(params.getSeed());
}
}
private boolean panic = false;
@Override
public synchronized void handleEvent(EASEvent e, Wink lastTick) {
if (e.getEventDescription().equals(" ")) {
this.panic = true;
PanicGhostAgent g = new PanicGhostAgent(99999, this, 1000, pars);
this.addAgent(
g,
new Vector2D(PanicAgent.fireLocation.x, PanicAgent.fireLocation.y),
0);
} else if (e.getEventDescription().equals("r")) {
this.panic = false;
// this.removeAgent(99999);
this.reset(55);
}
}
/**
* @return Returns the panic.
*/
public boolean isPanic() {
return this.panic;
}
public double getOutsideForce(int agentID) {
AgentList<PhysicsAgent2D<?>> agentlist = this.getAgent(agentID).getTouching();
double fges = 0;
for (int i = 0; i < agentlist.size(); i++) {
Vector2D pos = new Vector2D(agentlist.get(i).getPosition().getX(),
agentlist.get(i).getPosition().getY());
if (pos.distance(this.getAgentPosition(agentID)) <= PanicAgent.radius * 2) {
fges += agentlist.get(i).getForce().length();
}
}
return fges;
}
Random rand;
public synchronized void reset(final int agents) {
this.panic = false;
this.removeAgent(99999);
for (int i = 1000; i < 1000 + agents; i++) {
this.removeAgent(i);
}
for (int i = 1000; i < 1000 + agents; i++) {
this.addAgent(
new PanicAgent(i, this, 30, pars),
new Vector2D(
rand.nextDouble() * 90 + 5,
rand.nextDouble() * 90 + 5),
rand.nextDouble() * 360,
new Vector2D(1, 1));
}
}
}