
// Flocking3D.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th
// Sirinart Sakarin, March 2003, s4210315@calvin.coe.psu.ac.th

/* Tento program demonstruje houfování agentů.

   Agenti sledují jednoduchá pravidla, která řídí jejich pohyb.
   Když se tato jednoduchá pravidla za běhu programu kombinují, 
   vyvine se komplexní chování bez nutnosti jeho explicitního programování.

   Chování našeho agenta se skládá z:
      * příležitostně usedá
      * vyhává se překážkám
      * zůstává v oblasti scény
      * nepřekračuje maximální rychlost
      * aplikujeme na něj Reynoldovy rychlostní pravidla pro:
          - soudržnost
          - separaci
          - připojení      
      * predátoři loví (a požírají) kořist
      * kořist se snaží predátorům utéct

   Některé principy pocházejí z aplikace Boids Demo od Anthonyho Steeda
   (A.Steed@cs.ucl.ac.uk) na adrese
    http://www.cs.ucl.ac.uk/staff/A.Steed/3ddesktop

   Myšlenky nětkerých algoritmů pocházejí z pseudokódu v článku Boids
   od Conrada Parkera, který je k dispozici na adrese
   http://www.vergenet.net/~conrad/boidsList/pseudocode.html
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Flocking3D extends JFrame
{
  // konstanty pro počet predátorů, kořisti a překážek
  private static final int NUM_PREDATORS = 40;
  private static final int NUM_PREY = 160;
  private static final int NUM_OBSTACLES = 20;


  public Flocking3D(String[] args) 
  {
    super("Houfování agentů představujících predátory a kořist");

    int numPreds = NUM_PREDATORS;
    int numPrey = NUM_PREY;
    int numObstacles = NUM_OBSTACLES;

    // jednoduchá extrakce argumentů příkazového řádku    
    if (args.length >= 1) {
      try 
      { numPreds = Integer.parseInt( args[0] ); 
        numPrey = numPreds;    // stejný počet predátorů a kořistí
      }
      catch(NumberFormatException e)
      { System.out.println("Neplatný počet predátorů"); }
    }

    if (args.length >= 2) {
      try 
      { numPrey = Integer.parseInt( args[1] ); }
      catch(NumberFormatException e)
      { System.out.println("Neplatný počet kořistí"); }
    }

    if (args.length == 3) {
      try 
      { numObstacles = Integer.parseInt( args[2] ); }
      catch(NumberFormatException e)
      { System.out.println("Neplatný počet překážek"); }
    }

    Container c = getContentPane();
    c.setLayout( new BorderLayout() );
    WrapFlocking3D w3d = 
		new WrapFlocking3D(numPreds, numPrey, numObstacles);
    c.add(w3d, BorderLayout.CENTER);

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    pack();
    setResizable(false);    // rozměry okna jsou pevně dány
    setVisible(true);
  } // konec metody: Flocking3D()


// -----------------------------------------

  public static void main(String[] args)
  { new Flocking3D(args); }

} // konec třídy: Flocking3D

