Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање на језику Java - испити
Практични испит
12. 2. 2006.

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Саставити на језику Java следећи пакет класа:


Напомене (садржај)


Решење задатка (поставка | садржај)

// Vektor.java

package vatromet;

public class Vektor {
  private double x, y;
  Vektor (double xx, double yy) {x=xx; y=yy;}
  double x() { return x; }
  double y() { return y; }
}

// Figura.java

package vatromet;
import java.awt.Canvas;

public abstract class Figura {
  protected Scena scena;

  protected Figura (Scena s) { (scena = s).dodaj (this); }

  public abstract void crtaj ();

  public void unisti () { scena.izbaci (this); }
}

// Scena.java

package vatromet;
import java.awt.*;

public class Scena extends Canvas implements Runnable {
  private class Elem {
    Figura fig; Elem sled;

    Elem (Figura f) {
      fig = f;
      if (prvi == null) prvi = this; else posl.sled = this;
      posl = this;
    }
  }

  private Elem prvi, posl;
  private Thread nit = new Thread (this);

  public Scena () { nit.start (); }

  public void dodaj (Figura fig) { new Elem (fig); }

  public void izbaci (Figura fig) {
    Elem tek = prvi, pret = null;
    while (tek!=null && tek.fig!=fig)
      { pret = tek; tek = tek.sled; }
    if (tek != null) {
      if (pret == null) prvi = tek.sled;
        else pret.sled = tek.sled; if (tek.sled == null) posl = pret;
      if (prvi == null) posl = null;
    }
  }

  public void paint (Graphics g) {
    for (Elem tek=prvi; tek!=null; tek=tek.sled) tek.fig.crtaj ();
  }

  public void run () {
    try {
      while (! nit.interrupted()) { repaint (); nit.sleep (20); }
    } catch (InterruptedException g) {}
  }

  public void zavrsi () { nit.interrupt (); }
}

// Petarda.java

package vatromet;
import java.awt.*;

public abstract class Petarda extends Figura {
  private Vektor r0, v0; private long t0; protected Color boja;

  public Petarda (Scena s, Vektor rr0, Vektor vv0, Color bboja) {
    super (s);
    r0 = rr0; v0 = vv0; boja = bboja;
    t0 = System.currentTimeMillis ();
  }

  public Vektor polozaj () {
    double t = (System.currentTimeMillis() – t0) / 1000.;
    return new Vektor (
      r0.x() + v0.x() * t,
      r0.y() + v0.y() * t - 10 * t * t
    );
  }

  public void crtaj () {
    int sir = scena.getWidth (); int vis = scena.getHeight ();
    Vektor p = polozaj ();
    int x = (int)p.x ();         int y = vis - (int)p.y();
    if (x>=0 && x<sir && y>=0 && y<vis) {
      Graphics g = scena.getGraphics ();
      g.setColor (boja); crt (g, x, y);
    } else scena.izbaci (this);
  }

  protected abstract void crt (Graphics g, int x, int y);
}

// Krug.java

package vatromet;
import java.awt.*;

public class Krug extends Petarda {
  private int a;

  public Krug (Scena s, Vektor r0, Vektor v0, Color boja, int aa)
    { super (s, r0, v0, boja); a = aa; }

  public void crt (Graphics g, int x, int y)
    { g.fillOval (x-a/2, y-a/2, a, a); }
}

// Zvezda.java

package vatromet;
import java.awt.*;

public class Zvezda extends Petarda {
  private int a;

  public Zvezda (Scena s, Vektor r0, Vektor v0, Color boja, int aa)
    { super (s, r0, v0, boja); a = aa; }

  public void crt(Graphics g, int x, int y) {
    g.drawLine (x-a/2, y-a/2, x+a/2, y+a/2);
    g.drawLine (x+a/2, y-a/2, x-a/2, y+a/2);
    g.drawLine (x,     y-a/2, x,     y+a/2);
    g.drawLine (x-a/2, y,     x+a/2, y    );
  }
}

// Top.java

package vatromet;
import java.awt.*;

public class Top extends Figura implements Runnable {
  private static int ukId = 0;
  private int id = ++ukId, x, y, n;
  private Thread nit = new Thread (this);
  private boolean radi = false;

  public Top (Scena s, Vektor p) {
    super (s); scena = s;
    premesti (p); nit.start();
  }

  public void premesti (Vektor p) { x = (int)p.x(); y = (int)p.y(); }

  public int id () { return id; }

  public String toString () { return id + "/" + n; }

  public void crtaj () {
    int vis = scena.getHeight ();
    int y = vis - this.y;
    Graphics g = scena.getGraphics ();
    g.setColor (Color.LIGHT_GRAY);
    g.fillRect (x-20, y-20, 40, 20);
    g.setColor (Color.BLACK);
    g.drawRect (x-20, y-20, 40, 20);
    g.drawString (toString(), x-18, y-4);
  }

  public void run () {
    try {
      while (! nit.interrupted ()) {
        if (! radi) synchronized (this) { wait (); }
        Vektor p = new Vektor(x, y+20);
        Vektor v = new Vektor (-100+Math.random()*200, 50+Math.random()*100);
        Color b = new Color(
          (float)(Math.random()),
          (float)(Math.random()),
          (float)(Math.random())
        );
        int a = (int)(4+Math.random()*12);
        if (Math.random() < 0.5) new Krug (scena, p, v, b, a);
          else                      new Zvezda (scena, p, v, b, a);
        n++;
        nit.sleep ((long)(500+Math.random()*500));
      }
    } catch (InterruptedException g) {}
    scena.izbaci (this);
  }

  public synchronized void kreni () { radi = true; notify (); }

  public synchronized void stani () { radi = false; }

  public void zavrsi () { nit.interrupt (); }
}

// Vatromet.java

package vatromet;
import java.awt.*;
import java.awt.event.*;

public class Vatromet extends Frame {

  private Scena scena;
  private Top[] topovi = new Top [3];

  public Vatromet () {
    super ("Vatromet"); setSize (300, 200);
    addWindowListener (new WindowAdapter () {
      public void windowClosing (WindowEvent d) {
        for (int i=0; i<topovi.length; topovi[i++].zavrsi());
        scena.zavrsi (); dispose ();
      }
    });

    add (scena = new Scena(), "Center");
    scena.addComponentListener ( new ComponentAdapter () {
      public void componentResized (ComponentEvent d) {
        for (int i=0; i<topovi.length; i++)
          topovi[i].premesti (new Vektor(
            scena.getWidth()*(i+1)/
            (topovi.length+1), 0
          ));
      }
    });

    Panel plo = new Panel (); add (plo, "South");
    plo.setBackground (Color.GRAY);
    Button dgm = new Button ("Kreni"); plo.add (dgm);
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d)
        { for (int i=0; i<topovi.length; topovi[i++].kreni()); }
    });
    plo.add (dgm = new Button ("Stani"));
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d)
        { for (int i=0; i<topovi.length; topovi[i++].stani()); }
    });

    for (int i=0; i<topovi.length; i++)
      topovi[i] =  new Top (scena, new Vektor(0, 0));
    setVisible (true);
  }

  public static void main (String[] varg) { new Vatromet (); }
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 8.9.2010.