
// FractalLand3D.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Generuje fraktálovou krajinu tvořenou sítí čtverců, 
   které jsou otexturovány dle výšky, v níž se nacházejí.

   Míru nerovnosti krajiny ovládá hodnota plochosti zadané
   na příkazové řádce (nebo se použije výchozí hodnota).

   Krajina je obestřena temně modrými stěnami.
 
   Uživatel prochází krajinou za pomoci podobného
   ovládání jako v ukázkové aplikaci FPShooter3D.
*/

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


public class FractalLand3D extends JFrame
{
  private static final double DEF_FLAT = 2.3;   // vytvoří rovinatější,
  private static final double MIN_FLAT = 1.6;   // skalnatou
  private static final double MAX_FLAT = 2.5;   // nebo velmi rovinatou krajinu


  public FractalLand3D(String[] args) 
  {
    super("3D-fraktální krajina");

    double flatness = processArgs(args);
    System.out.println("Flatness: " + flatness);

    WrapFractalLand3D w3d = new WrapFractalLand3D(flatness);

    Container c = getContentPane();
    c.setLayout( new BorderLayout() );
    c.add(w3d, BorderLayout.CENTER);

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


  private double processArgs(String[] args)
  // povolen je 1 nebo žádný argument
  {
    double flatness = DEF_FLAT;
    if (args.length == 1)
      flatness = getFlatness(args[0]);
    else if (args.length > 1) {
      System.out.println("Použití: java FractalLand3D [<Flatness>]");
      System.exit(0);
    }
    return flatness;
  }  // konec metody: processArgs()


  private double getFlatness(String arg)
  // plochost musí být reálné číslo v rozmezí MIN_FLAT až MAX_FLAT
  {
    double flatness;
    try {
      flatness = Double.parseDouble(arg);
      if ((flatness < MIN_FLAT) || (flatness > MAX_FLAT)) {
        System.out.println("Koeficient plochosti musí být mezi " + 
					MIN_FLAT + " a " + MAX_FLAT);
        flatness = DEF_FLAT;
      }
     }
    catch (NumberFormatException ex)
    { System.out.println("Nesprávný formát koeficientu plochosti");  
      flatness = DEF_FLAT;
    }
    return flatness;
  }  // konec metody: getFlatness()


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

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

} // konec třídy: FractalLand3D
