algorytm.org

Implementacja w Java



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

L-systemy - Implementacja w Java
Ocena użytkownikóww: *****  / 0
SłabyŚwietny
Nadesłany przez Andrzej Partyka, 27 grudnia 2013 12:25
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

Qlsyst.java:
/*
   18.IX.2008                                               Qlsyst.java
   www.algorytm.org
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.awt.geom.*;
import java.net.*;
import java.awt.image.*;
import javax.print.*;
import javax.print.attribute.*;
import java.awt.print.*;
import java.util.*;
class TURTLE implements Cloneable {
   public   double X,Y,Alfa;
   public   Color  Kolor;
   public TURTLE(double x, double y, double alfa, Color color) {
      X = x;
      Y = y;
      Alfa = alfa;
      Kolor = color;
   }
   public TURTLE() {
      X =0.0;  Y = 0.0;
      Alfa = 0;
      Kolor = Color.black;
   }
   public TURTLE clone() {
      TURTLE trt = new TURTLE();
      try {
         trt = (TURTLE)super.clone();
      } catch(CloneNotSupportedException    e) {
         System.out.println("SZCZUR w TURTLE.clone"); System.exit(1);
      }
      return trt;
   }
}
//==========================================================
class Rysunek  {
   Qlsyst Qls;
   FraktPanel Pan1;
   int NrIter = 0;
   JLabel Opis;
   double Y0, Xwmin, Xwmax, Ywmin, Ywmax, K, Kx, Ky;
   int szer, wys;
   public Rysunek(Qlsyst qls, FraktPanel pan1, JLabel opis) {
      Qls = qls;
      Pan1 = pan1;
      Opis = opis;
      NrIter = 0;
      Qls.OpisTr.setText( opis.getText() );
      Dimension wym = Pan1.getSize();
      szer = wym.width; wys = wym.height;
      if( Qls.Test && (szer <= 0 || wys <= 0) ) {
         System.out.println("szer = "+szer+"  wys = "+wys+
           "\nObrazEkr NIE utworzony !");
         Pan1.ObrazEkr = null;
      } else {
         Pan1.ObrazEkr = new ObrazEkranu(szer, wys);
         if( Qls.Test)
            System.out.println("Utworzono ObrazEkr("+szer+", "+wys+")" );
      }
      Xwmin = Qls.Xmin;    Xwmax = Qls.Xmax;
      Ywmin = Qls.Ymin;    Ywmax = Qls.Ymax;
      Y0 = (double)wys;
      Kx = szer/(Xwmax - Xwmin);
      Ky = wys/(Ywmax - Ywmin);
      K = Math.min( Kx, Ky );
      if(Qls.Test)
         System.out.println("Kx="+Kx+", Ky="+Ky+", K="+K+", Y0="+Y0);
      NrIter = 0;
   }
   void drawLine(double xp, double yp, double xk, double yk) {
      Graphics g = Pan1.getGraphics();
      Color kolor = Pan1.getForeground();
      int x1, y1, x2, y2;
      if(yk < Ywmin) {
         if(Qls.Test) System.out.println("yk="+yk+" a Ywmin="+Ywmin);
      }
      if(yk > Ywmax) {
         if(Qls.Test) System.out.println("yk="+yk+" a Ywmax"+Ywmax);
      }
      if(xk > Xwmax) {
         if(Qls.Test) System.out.println("xk="+xk+" a Xwmax="+Xwmax);
      }
      x1 = (int)( K * (xp - Xwmin) );
      y1 = (int)( -K * (yp - Ywmin) + Y0);
      x2 = (int)( K * (xk - Xwmin) );
      y2 = (int)( -K * (yk - Ywmin) + Y0);
      NrIter++;
      g.setColor( kolor );
      g.drawLine(x1,y1,x2,y2);
      if(y1 < 0 || y1 > wys || y2 < 0 || y2 > wys) {
         if(Qls.Test)
         System.out.println("drawLine: x1 = "+x1+" y1 ="+y1+"  x2 = "+x2+
                                    " y2 = "+y2);
      }
      if(Pan1.ObrazEkr != null ) {
         Graphics2D g2 = Pan1.ObrazEkr.Obraz().createGraphics();
         g2.setColor( kolor );
         g2.drawLine(x1,y1,x2,y2);
         g2.dispose();
      }
      g.dispose();
   }
}
//==========================================================
class FraktPanel extends JPanel {
   Qlsyst Qls;
   Rysunek Rys0;
   Color KolorTla, KolorRys;
   ObrazEkranu  ObrazEkr;
   FraktPanel(Qlsyst qls, Color kolorRys, Color kolorTla) {
      Qls = qls;
      KolorTla = kolorTla; KolorRys = kolorRys;
      setBackground( kolorTla );
      setForeground(kolorRys);
      setOpaque(true);
      Dimension wym = getSize();
      ObrazEkr = null;
   }
   void zmienKolory(Color kolorRys, Color kolorTla) {
      setBackground( kolorTla );
      setForeground(kolorRys);
      KolorTla = kolorTla; KolorRys = kolorRys;
      repaint();
   }
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if(Qls.Rys0 != null && ObrazEkr != null) {
         ImageIcon img = new ImageIcon( ObrazEkr.Obraz() );
         img.paintIcon(this, g, 0, 0);
         if(Qls.Test) System.out.println("Wykonano img.paintIcon");
      }
   }
}
//=========================================================
enum StanSzuk { przedsym, przedznak, wstringu, pobyku }
//=========================================================
public class Qlsyst extends JFrame implements ActionListener {
   final int          Vsb = JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                      Hsb = JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;
   Dimension ekr;
   File PlikOdczytany = null;
   String  NazwaPliku;
   int szerekr,wysekr,szram,wram;
   String KatStart = System.getProperty("user.dir");
   Color              KolorRys = Color.black, KolorTla = Color.white;
   public String      Axiom;
   public String      FProd,fProd;
   public String      GProd,HProd,IProd,JProd,XProd,YProd,
                      GDef,HDef,IDef,JDef,XDef,YDef;
   public double      Beta,Skurcz;
   public TURTLE      Stan;
   public double      TurtleStep;
   public int         IleIter;
   public Stack<TURTLE> Stos;
   public FraktPanel  Pan1;
   JFrame Frame0;
   FraktPanel Panel1;
   JMenu   Men0;
   JMenuItem JmKoniec, JmKolFrakt, JmKolTla, JmHelp,
             JmCzyt,JmZap, JmDruk, JmPodglDr, JmUstStr;
   double Xmin, Ymin, Xmax, Ymax;
   double alfaPocz, KrokPocz = 100;
   JPanel Opis;
   JLabel OpisTr;
   JPanel przyciski, polaparm;
   Box polaster;
   JScrollPane PanSter;
   JTextArea Regl;
   Rysunek Rys0;
   boolean LiczObszar;
   JButton RysButt;
   JTextField Tpozrek, Tbeta,Tskurcz, Tnazw, TalfaPocz, TkrokPocz;
   public boolean Test;
   public Qlsyst(double degstop, double skurcz, boolean test) {
      Test = test;
      JFileChooser Wybor;
      Color KolorRys = Color.black, KolorTla = Color.white;
      Dimension ekr;
      Stan = new TURTLE();
      Stos = new Stack<TURTLE>();
      Frame0 = this;
      Frame0.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Reset();
      wycentruj(Frame0);
      Men0 = new JMenu("Plik");
      Men0.setMnemonic(KeyEvent.VK_P);
      JmKolFrakt = UtwElMenu("Kolor Fraktala","KolorRys" ,KeyEvent.VK_F);
      Men0.add(JmKolFrakt);
      JmKolTla = UtwElMenu("Kolor Tła","KolorTla" ,KeyEvent.VK_T);
      Men0.add(JmKolTla);
      JmHelp = UtwElMenu("Pomoc", "Help", KeyEvent.VK_C);
      Men0.add(JmHelp);
/*
      JmDruk = UtwElMenu("Drukuj fraktal", "Druk", KeyEvent.VK_D);
      Men0.add(JmDruk);
      JmPodglDr = UtwElMenu("Podgląd druku", "PodglDr", KeyEvent.VK_P);
      Men0.add(JmPodglDr);
      JmUstStr = UtwElMenu("Ustawienia strony","UstStr", KeyEvent.VK_U);
      Men0.add(JmUstStr);
*/
      JmCzyt = UtwElMenu("Wczytaj z pliku", "Odczyt", KeyEvent.VK_W);
      Men0.add(JmCzyt);
      JmZap = UtwElMenu("Zapisz", "Zapis", KeyEvent.VK_S);
      Men0.add(JmZap);

      Men0.addSeparator();
      JmKoniec = UtwElMenu("Zakończ","Koniec" ,KeyEvent.VK_Z);
      Men0.add(JmKoniec);
      JMenuBar pasekMenu = new JMenuBar();
      pasekMenu.add(Men0);
      setJMenuBar(pasekMenu);
      Opis = new JPanel();
      OpisTr = new JLabel("L-systemy");
      Opis.add( OpisTr );
      Beta = Math.toRadians(degstop);
      Skurcz = skurcz;
      polaster = Box.createVerticalBox();
      polaparm = new JPanel();
      polaparm.add(new JLabel("Nazwa: ") );
      Tnazw = new JTextField("Drzewko");
      polaparm.add(Tnazw);
      polaparm.add(new JLabel(" Skurcz: ") );
      Tskurcz = new JTextField(" 0.333 ");
      polaparm.add(Tskurcz);
      polaparm.add(new JLabel("  Beta ( stopni ): ") );
      Tbeta = new JTextField(" 45 ");
      polaparm.add(Tbeta);
      polaparm.add(new JLabel("  AlfaPocz ( stopni ): ") );
      TalfaPocz = new JTextField(" 90 ");
      polaparm.add(TalfaPocz);
      polaparm.add(new JLabel("Poziom rekursji: ") );
      Tpozrek = new JTextField(" 001 ");
      polaparm.add(Tpozrek);
      polaster.add(polaparm);
      JPanel pandod = new JPanel();
      pandod.add( new JLabel(" Krok pocz. ") );
      TkrokPocz = new JTextField(" 100 ");
      pandod.add(TkrokPocz);
      polaster.add(pandod);
      JPanel polareg = new JPanel();
      String s0 = "A:F\nF:F[+F]F[-F]F";
      Regl = new JTextArea(s0, 3,45);
      Font f0 = Regl.getFont();
      int fsize = f0.getSize();
      fsize = (int)( fsize*1.25);
      Regl.setFont( f0.deriveFont(Font.BOLD, fsize ) );
      polareg .add(Regl);
      polareg.setBorder(
        BorderFactory.createTitledBorder("Reguły przekształceń "+
            "symboli") );
      polaster.add(polareg);
      przyciski = new JPanel();
      RysButt = new JButton("Rysuj");
      RysButt.addActionListener(this);
      przyciski.add( RysButt );
      polaster.add(przyciski);
      PanSter = new JScrollPane(polaster, Vsb, Hsb);
      Panel1 = new FraktPanel(this,KolorRys, KolorTla);
      Frame0.getContentPane().add(Opis, BorderLayout.NORTH);
      Frame0.getContentPane().add(Panel1, BorderLayout.CENTER);
      Frame0.getContentPane().add(PanSter,BorderLayout.SOUTH);
      Frame0.setVisible( true );
   }
   void Reset() {
      Axiom = new String();
      FProd = new String();
      fProd = new String();
      GProd = new String();
      HProd = new String();
      IProd = new String();
      JProd = new String();
      XProd = new String();
      YProd = new String();
      GDef = new String();
      HDef = new String();
      IDef = new String();
      JDef = new String();
      XDef = new String();
      YDef = new String();
      Stan = new TURTLE();
      Stos = new Stack<TURTLE>();
   }
   private JMenuItem UtwElMenu( String nazwa, String akcja ) {
      JMenuItem m = new JMenuItem( nazwa );
      m.setActionCommand(akcja);
      m.addActionListener( this );
      return m;
   }
   private JMenuItem UtwElMenu( String nazwa, String akcja, int skrot ) {
      JMenuItem m = new JMenuItem( nazwa, skrot );
      m.setActionCommand(akcja);
      m.addActionListener( this );
      return m;
   }
   boolean niepoprawnaLiczba(String nazwa,int vdbl, JTextField jf) {
      String s0; double nr; int nri;
      boolean wynik = false;
      s0 = jf.getText().trim();
      try {
         if( vdbl == 1) {
            nr = Double.parseDouble( s0 );
         } else {
            nri = Integer.parseInt( s0 );
         }
      }
      catch(NumberFormatException e) {
         Powiadom("NIEPOPRAWNA postać liczby w polu: "+ nazwa + ": "+ s0);
         jf.requestFocus();
         wynik = true;
      }
      return wynik;
   }
//   public String  Strdup(String s0,String plik, int linia);
   private void wycentruj(JFrame f) {
      int szekr,wekr,szram,wram;
      Dimension ekr = Toolkit.getDefaultToolkit().getScreenSize();
      szekr = ekr.width; wekr = ekr.height;
      szram = (9*szekr)/10; wram = (9*wekr)/10;
      int bok = Math.min(szram,wram);
      f.setSize(bok,bok);
      f.setLocation( (szekr-szram)/2, (wekr-wram)/2);
   }
   void zmienKolorFrakt() {
      Color nowykolor;
      nowykolor = JColorChooser.showDialog(
                    this,                // element nadrzędny
                    "Kolor dla fraktala",    // tytuł
                    KolorRys);            // domyślnie
      if( nowykolor == null)
         return;
       Color  dawny = KolorRys;
       KolorRys = nowykolor;
       if(dawny.getRGB() != KolorRys.getRGB() ) {
          if(Panel1.ObrazEkr != null) {
             Panel1.ObrazEkr.zamienKolor(dawny, nowykolor);
          }
       }
       Panel1.zmienKolory(KolorRys, KolorTla);
   }
   void zmienKolorTla() {
      Color nowykolor;
      nowykolor = JColorChooser.showDialog(
                    this,                // element nadrzędny
                    "Kolor dla Tła",     // tytuł
                    KolorTla);           // domyślnie
      if( nowykolor == null)
         return;
       KolorTla = nowykolor;
       Panel1.zmienKolory(KolorRys, KolorTla);
   }
   public void WykonajF(){
      double dx,dy;
      dx = TurtleStep * Math.cos(Stan.Alfa);
      dy = TurtleStep * Math.sin(Stan.Alfa);
      if( ! LiczObszar ) {
         Rys0.drawLine(Stan.X,Stan.Y,Stan.X+dx, Stan.Y+dy);
      }
      Stan.X += dx;
      Stan.Y += dy;
      if(LiczObszar) {
         Xmin = Math.min(Stan.X, Xmin);
         Ymin = Math.min(Stan.Y, Ymin);
         Xmax = Math.max(Stan.X, Xmax);
         Ymax = Math.max(Stan.Y, Ymax);
      }
   }
   public void Wykonaj_f(){
      Stan.X += TurtleStep * Math.cos(Stan.Alfa);
      Stan.Y += TurtleStep * Math.sin(Stan.Alfa);
      if(LiczObszar) {
         Xmin = Math.min(Stan.X, Xmin);
         Ymin = Math.min(Stan.Y, Ymin);
         Xmax = Math.max(Stan.X, Xmax);
         Ymax = Math.max(Stan.Y, Ymax);
      }
   }
   public void WykonajPlus(){
      Stan.Alfa -= Beta;
   }
   public void WykonajMinus(){
      Stan.Alfa += Beta;
   }
   public void WykonajDef(String s0) {
      int i;
      char c0;
      for(i = 0; i < s0.length(); i++) {
         c0 = s0.charAt(i);
         switch(c0) {
            case '+': WykonajPlus(); break;
            case '-': WykonajMinus(); break;
            case 'F': WykonajF(); break;
            case 'f': Wykonaj_f(); break;
            default: break;
         } // end of switch(c0)
      }
   }
   public  void WykonajG(){
      if(GDef == null || GDef.length() == 0) return;
      WykonajDef(GDef);
   }
   public  void WykonajH(){
      if(HDef == null || HDef.length() == 0) return;
      WykonajDef(HDef);
   }
   public  void WykonajI(){
      if(IDef == null || IDef.length() == 0) return;
      WykonajDef(IDef);
   }
   public  void WykonajJ(){
      if(JDef == null || JDef.length() == 0) return;
      WykonajDef(JDef);
   }
   public  void WykonajX(){
      if(XDef == null || XDef.length() == 0) return;
      WykonajDef(XDef);
   }
   public  void WykonajY(){
      if(YDef == null || YDef.length() == 0) return;
      WykonajDef(YDef);
   }
   public String  AProd(int[] i, String formula) {
      String     wynik;
      int i0 = i[0];
      StringBuffer wyj = new StringBuffer();
      int        j;
      i0 += 2;
      wyj.append('A');
      wyj.append (formula.charAt(i0-1) );
      j = 2;
      while(i0 < formula.length() &&
         ( formula.charAt(i0) >= '0' && formula.charAt(i0) <= '9')) {
         wyj.append( formula.charAt(i0) );
         i0++;
         j++;
      }
      i0--;
      wynik = new String(wyj);
      i[0] = i0;
      return wynik;
   }
   String rProd(int[] i, String formula) {
      String     wynik;
      int i0 = i[0];
      StringBuffer  wyj = new StringBuffer();
      int        j;
      i0 += 2;
      wyj.append('r');
      wyj.append(  formula.charAt(i0-1) );
      j = 2;
      while(i0 < formula.length() &&
         ( formula.charAt(i0) >= '0' && formula.charAt(i0) <= '9')) {
         wyj.append( formula.charAt(i0) );
         i0++;
         j++;
      }
      i0--;
      wynik = new String(wyj);
      i[0] = i0;
      return wynik;
   }
   public int WykonajA(int i, String formula) {
      StringBuffer sb = new StringBuffer();
      char c;
      double deg;
      String s0;
      i += 2;
      sb.append(formula.charAt(i-1) ); c = formula.charAt(i);
      while(i < formula.length() && c >= '0' && c <= '9' ) {
         sb.append(c); i++;
         if(i < formula.length() ) c = formula.charAt(i);
      }
      i--;
      s0 = new String(sb);
      deg = Math.toRadians( Double.parseDouble(s0) );
      Stan.Alfa -= deg;
      return i;
   }
   public int Wykonaj_r(int i,String formula) {
      StringBuffer sb = new StringBuffer();
      char c0, c;
      double deg;
      String s0;
      i += 2; c0 = formula.charAt(i-1);
      sb.append( c0 );
      c = formula.charAt(i);
      while(i < formula.length() && c >= '0' && c <= '9' ) {
         sb.append(c); i++;
         if(i < formula.length() ) c = formula.charAt(i);
      }
      s0 = new String(sb);
      if(Test) System.out.println("Kąt: "+s0);
      deg = Math.toRadians( Double.parseDouble(s0) );
      if(Test) System.out.println("Kąt: "+deg);
      deg = Math.random()* deg;
      if(Test) System.out.println("Kąt zrandomizowany: "+deg);
      Stan.Alfa -= deg;
      return i;
   }
   public void Rysuj(int iliter, double dlgkrokpocz, int zerox,int zeroy) {
      Stan.X = zerox;
      Stan.Y = zeroy;
      IleIter = iliter;
      try {
         TurtleStep = dlgkrokpocz *
              Math.exp( IleIter * Math.log(Skurcz) );
      } catch(Exception e) {
        System.out.println("Szczur przy liczeniu TurtleStep: "+e);
        System.exit(1);
      }
      Interpretuj(Axiom,1);
   }
   public void WyznaczObszar(int iliter, double dlgkrokpocz,
                                         int zerox,int zeroy) {

      int i;
      Stan.X = zerox;
      Stan.Y = zeroy;
      Xmin = 0; Ymin = 0; Xmax = 0; Ymax = 0;
      IleIter = iliter;
      TurtleStep = dlgkrokpocz *
              Math.exp( IleIter * Math.log(Skurcz) );
      LiczObszar = true;
      Interpretuj(Axiom,1);
      double dx = 0.0125*(Xmax - Xmin), dy = 0.0125*(Ymax - Ymin);
      Xmin -= dx; Ymin -= dy; Xmax += dx; Ymax += dy;
   }  // koniec WyznaczObszar;
   public void Interpretuj(String formula, int nrkroku){
      int  i = 0;
      String str1 = new String(), s1;
      char c0;
      int[] itt;
      if(nrkroku <= IleIter) {
         while(i < formula.length() ) {
            c0 = formula.charAt(i);
            switch( c0 ) {
               case 'F':
                  Interpretuj(FProd,nrkroku+1);
                  break;
               case 'f':
                  Interpretuj(fProd,nrkroku+1);
                  break;
               case '+':
                  Interpretuj("+",nrkroku+1);
                  break;
               case '-':
                  Interpretuj("-",nrkroku+1);
                  break;
               case '[':
                  Interpretuj("[",nrkroku+1);
                  break;
               case ']':
                  Interpretuj("]",nrkroku+1);
                  break;
               case 'A':
                  itt = new int[2]; itt[0] = i;
                  s1 = AProd(itt,formula);
                  i = itt[0];
                  Interpretuj(s1,nrkroku+1);
                  break;
               case 'r':
                  itt = new int[2]; itt[0] = i;
                  s1 = rProd(itt,formula);
                  i = itt[0];
                  Interpretuj(s1,nrkroku+1);
                  break;
               case 'G':
                  Interpretuj(GProd,nrkroku+1);
                  break;
               case 'H':
                  Interpretuj(HProd,nrkroku+1);
                  break;
               case 'I':
                  Interpretuj(IProd,nrkroku+1);
                  break;
               case 'J':
                  Interpretuj(JProd,nrkroku+1);
                  break;
               case 'X':
                  Interpretuj(XProd,nrkroku+1);
                  break;
               case 'Y':
                  Interpretuj(YProd,nrkroku+1);
                  break;
            } // end of switch
            i++;
         } // end of while
      } else {
         while(i < formula.length()) {
            c0 = formula.charAt(i);
            switch( c0 ) {
               case 'F': if(Test) System.out.println("F:");
                  WykonajF();
                  break;
               case 'f': if(Test) System.out.println("f:");
                  Wykonaj_f();
                  break;
               case '+': if(Test) System.out.println("+:");
                  WykonajPlus();
                  break;
               case '-': if(Test) System.out.println("-:");
                  WykonajMinus();
                  break;
               case '[': if(Test) System.out.println("[:");
                  Stos.push( Stan.clone() ); // i TO JEST TO !!!
                  break;
               case ']': if(Test) System.out.println("]:");
                  if( Stos.empty() ) {
                     Powiadom("Pobieranie z pustego stosu !"); break;
                  } else {
                     if(Test) meldujStan("** przed pop-em Stan: ",Stan);
                     Stan = Stos.pop(); // NARESZCIE ?!
                     if(Test) meldujStan("* po pop-ie Stan: ",Stan);
                     break;
                  }
               case 'A': if(Test) System.out.println("A:");
                  i = WykonajA(i,formula);
                  break;
               case 'r': if(Test) System.out.println("r:");
                  i = Wykonaj_r(i,formula);
                  break;
               case 'G': if(Test) System.out.println("G:");
                  WykonajG();
                  break;
               case 'H': if(Test) System.out.println("H:");
                  WykonajH();
                  break;
               case 'I': if(Test) System.out.println("I:");
                  WykonajI();
                  break;
               case 'J': if(Test) System.out.println("J:");
                  WykonajJ();
                  break;
               case 'X': if(Test) System.out.println("X:");
                  WykonajX();
                  break;
               case 'Y': if(Test) System.out.println("Y:");
                  WykonajY();
                  break;
               default:
                  if(Test) System.out.println("Znak: "+c0); break;
            } // end of switch
            i++;
         } // end of while
      }
   }
   public void actionPerformed(ActionEvent e) {
      String kom = e.getActionCommand( );
      Object obj = e.getSource();
      if(obj == RysButt) {
         Narysuj();
         return;
      }
      if( kom.equals("Koniec") ) {
         System.exit(0);
         return;
      }
      if(kom.equals("Zapis") ) {
         ZapiszPlik("L-system"); return;
      }
      if(kom.equals("Odczyt") ) {
         odczytajPlik();  Narysuj(); return;
      }
      if( kom.equals("KolorRys") ) {
         zmienKolorFrakt();
      }
      if(kom.equals("KolorTla") ) {
         zmienKolorTla();
      }
      if(kom.equals("Help") ) {
         helpHtml(); return;
      }
   }
   void Narysuj() {
      String s0;
      int ustRegWyn;
      Rys0 = null; Panel1.repaint();
      if( niepoprawnaLiczba("Poziom rekursji",0, Tpozrek) )  return;
      s0 = Tpozrek.getText().trim();
      int iliter =Integer.parseInt(s0);
      if( niepoprawnaLiczba("Skurcz",1, Tskurcz) )  return;
      IleIter = iliter;
      s0 = Tskurcz.getText().trim();
      Skurcz = Double.parseDouble(s0);
      if( niepoprawnaLiczba("Beta",1, Tbeta) ) return;
      s0 = Tbeta.getText().trim();
      Beta = Math.toRadians( Double.parseDouble(s0)  );
      if( niepoprawnaLiczba("AlfaPocz",1, TalfaPocz) ) return;
      s0 = TalfaPocz.getText().trim();
      alfaPocz = Math.toRadians( Double.parseDouble(s0)  );
      Stan.Alfa = alfaPocz;
      if(niepoprawnaLiczba("Krok pocz.",1, TkrokPocz)  ) return;
      s0 = TkrokPocz.getText().trim();
      KrokPocz = Double.parseDouble(s0);
      ustRegWyn = ustawRegl(Regl);
      if(ustRegWyn > 0) {
         Powiadom("Błąd w zapisie reguł");
         return;
      }
      LiczObszar = true;
      WyznaczObszar(iliter,KrokPocz,0,0);
      LiczObszar = false;
      Rys0 = new Rysunek(this, Panel1, new JLabel( Tnazw.getText() ) );
      Stan.Alfa = alfaPocz;
      Rysuj(iliter, KrokPocz, 0,0); //NOWE
      String s1 = OpisTr.getText() + "   ( Linii: " +
       new Integer(Rys0.NrIter).toString() + " )";
      OpisTr.setText(s1);
   }
   void meldujStan(String s0, TURTLE trtl) {
      double alfa = Math.toDegrees(trtl.Alfa);
      String sX = String.format(Locale.US,"%7.4f", trtl.X);
      String sY = String.format(Locale.US,"%7.4f", trtl.Y);
      System.out.println(s0+" "+"X="+sX+", Y="+sY+
                         ", Alfa="+alfa);
   }
   void helpHtml() {
      String plikPomocy = "Qlsyst.html";
      URL url = Qlsyst.class.getResource(plikPomocy);
      if(url == null ) {
         Powiadom(
             "NIE znaleziono pliku \""+plikPomocy + "\"\n"
           +" Wyświetlenie pomocy nie jest mozliwe");
         return;
      }
      JFrame fram = new HelpFrame(url,
                       "Pokaz fraktali typu IFS - Informacje");
      fram.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      fram.setVisible(true);
   }
   void Powiadom(String kom) {
      int k;
      k = JOptionPane.showConfirmDialog(Frame0,
        kom + "\nYES przerwie program",
        "Qlsyst komunikat",
        JOptionPane.YES_NO_OPTION,
        JOptionPane.INFORMATION_MESSAGE
     );
      if(k == JOptionPane.YES_OPTION) {
          System.out.println("Program przerwany przez klienta");
          System.exit(0);
      }
      return;
   }
// enum StanSzuk { przedsym, przedznak, wstringu, pobyku }
   public int ustawRegl( JTextArea jta0) {
      String s0 = jta0.getText();
      StanSzuk stan = StanSzuk.przedsym;
      StringBuffer sb = new StringBuffer();
      char sym = '?', rodz = '?',znak;
      jta0.requestFocus();
      jta0.setSelectedTextColor(Color.red );
      jta0.setSelectionColor(Color.green);
      int it0 = 0;
      String s2;
      boolean byk = false;
      for(it0 = 0; it0 < s0.length(); it0++ ) {
         znak = s0.charAt(it0);
         if(znak == ' ') {
            continue;
         }
         switch(stan) {
            case przedsym:
               switch( znak) {
                  case 'A': case 'F': case 'f': case 'G': case 'H':
                  case 'I': case 'J': case 'X': case 'Y':
                     sym = znak; stan = StanSzuk.przedznak;
                     break;
                  case '\n': break;
                  default:
                     byk = true;
                     jta0.setSelectionStart(it0);
                     jta0.setSelectionEnd(it0+1);
                     Powiadom("Zły znak początku reguły "+znak+
                        "\n na pozycji "+it0);
                     it0 = s0.length();
               } //end of switch(znak)
               break;
            case przedznak:
               switch(znak) {
                  case ':': case '=':
                     rodz = znak; stan=StanSzuk.wstringu;
                     sb = new StringBuffer();
                     break;
                  default:
                     byk = true;
                     jta0.setSelectionStart(it0);
                     jta0.setSelectionEnd(it0+1);
                     Powiadom("Znak musi być : lub = a jest "+znak+
                     "\n na pozycji "+it0);
                     it0 = s0.length();
               } //end of switch(znak)
               break;
            case wstringu:
               if(znak == '\n' || znak == ';' || it0 == s0.length() - 1 ) {
                  if(it0 ==  s0.length() - 1 ) {
                     sb.append(znak);
                  }
                  switch(sym) {
                     case 'A': Axiom = new String(sb);
                        break;
                     case 'F': FProd = new String(sb);
                        break;
                     case 'f': fProd = new String(sb); break;
                     case 'G':
                        if(rodz == ':')
                           GProd = new String(sb);
                        else
                           GDef = new String(sb);
                        break;
                     case 'H':
                        if(rodz == ':')
                           HProd = new String(sb);
                        else
                           HDef = new String(sb);
                        break;
                     case 'I':
                        if(rodz == ':')
                           IProd = new String(sb);
                        else
                           IDef = new String(sb);
                        break;
                     case 'J':
                        if(rodz == ':')
                           JProd = new String(sb);
                        else
                           JDef = new String(sb);
                        break;
                     case 'X':
                        if(rodz == ':')
                           XProd = new String(sb);
                        else
                           XDef = new String(sb);
                        break;
                     case 'Y':
                        if(rodz == ':')
                           YProd = new String(sb);
                        else
                           YDef = new String(sb);
                        break;
                  } // end of switch(sym)
                  stan = StanSzuk.przedsym;
                     s2 = (znak == ';') ? "średnika" : "nowej linii" ;
               } else {
                  sb.append(znak);
               } // end of if;
               break;
         } // end of switch( stan );
      } // end of for
      return (byk) ? 1 : 0;
   }
   File wyznaczNazwePlikuZapisu(String s0) {
      Dimension ekr;
      int szerekr, wysekr, szram, wram;
      JFileChooser wybor = new JFileChooser( KatStart);
      JFileFilter filtr = new JFileFilter();
      filtr.addType("Lsys");
      filtr.setDescription("pliki definicji L-systemu");
      wybor.addChoosableFileFilter(filtr);
      wybor.setDialogTitle("Wybór nazwy pliku do zapisu ( " + s0 + ")" );
      ekr  = Toolkit.getDefaultToolkit().getScreenSize();
      szerekr = ekr.width; wysekr = ekr.height;
      szram = (9*szerekr)/10; wram = (9*wysekr)/10;
      wybor.setPreferredSize( new Dimension(szram,wram)  );
      int wynik = wybor.showSaveDialog(this);
      if (wynik == JFileChooser.CANCEL_OPTION) return null;
      // Zapisz dane do wybranego pliku...
      File plik = wybor.getSelectedFile( );
      return plik;
   }
   boolean zezwolenieNaZapis( String nazwa ) {
      int wynikDial;
      File ff = new File(nazwa);
      if( ! ff.exists() ) return true;
      Toolkit.getDefaultToolkit().beep();
      wynikDial = JOptionPane.showConfirmDialog(
         this, //Component parentComponent,
         "Plik "
        +nazwa
        +" już istnieje, jego obecna zawartość będzie ZNISZCZONA\n"//message
        +"                       Zgoda na to ?",
         "UWAGA nie zniszcz sobie pliku !!!", // String title,
         JOptionPane.YES_NO_OPTION,  // int optionType,
         JOptionPane.WARNING_MESSAGE     /*int messageType*/);
      return (wynikDial == JOptionPane.YES_OPTION) ? true : false;
   }
   void ZapiszPlik(String n0) {
      File fnpl = wyznaczNazwePlikuZapisu(n0);
      if(fnpl == null) {
         Powiadom("Zrezygnowano z zapisu L-systemu");
         return;
      }
      String nowyPlik = fnpl.getAbsolutePath();
      if( ! zezwolenieNaZapis(nowyPlik) ) {
         Powiadom("Nie zapisano opisu L-systemu\n"
                 +"w pliku \""+ nowyPlik + "\"\n"
                 +"bo użytkownik się nie zgodził");
         return;
      }
      if( ZapiszDoPliku(nowyPlik) ) {
         Powiadom("Zapisano opis L-systemu w pliku "+nowyPlik);
      } else {
         Powiadom("NIEUDANY zapis pliku  "+nowyPlik);
      }
   }
   public boolean ZapiszDoPliku(String nplik) {
      int i;
      PrintStream wy;
      try {
         wy = new PrintStream(nplik);
      }
      catch(Exception e) {
         System.out.println("Nieudane otwarcie pliku "+ nplik + "\n" + e);
         return false;
      }
      wy.println(Tnazw.getText() );
      wy.println("Skurcz: "+Tskurcz.getText() );
      wy.println("Beta: "+Tbeta.getText() );
      wy.println("AlfaPocz: "+TalfaPocz.getText() );
      wy.println("Iteracji: "+IleIter);
      wy.println("KrokPocz: "+TkrokPocz.getText() );
      wy.println("Przekszt:");
      wy.println(Regl.getText() );
      wy.close();
      return true;
   }
   String nazwPliku() {
      JFileChooser wybor = new JFileChooser( KatStart );
      JFileFilter filtr = new JFileFilter();
      filtr.addType("Lsys");
      filtr.setDescription("pliki definicji L-systemu");
      wybor.addChoosableFileFilter(filtr);
      ekr  = Toolkit.getDefaultToolkit().getScreenSize();
      szerekr = ekr.width; wysekr = ekr.height;
      szram = (9*szerekr)/10; wram = (9*wysekr)/10;
      wybor.setPreferredSize( new Dimension(szram,wram)  );
      wybor.setDialogTitle("Wybór pliku definicji L-systemu ( *.Lsys ) ");
      int wynik = wybor.showOpenDialog(this);
      if (wynik == JFileChooser.CANCEL_OPTION) return null;
      PlikOdczytany = wybor.getSelectedFile( );
      KatStart = PlikOdczytany.getPath();
      return PlikOdczytany.getAbsolutePath();
   }
   void odczytajPlik() {
      NazwaPliku = nazwPliku();
      if(NazwaPliku == null) {
         Powiadom("NIC nie wybrano !"); return;
      }
      Wczytaj(NazwaPliku);
   }
   public boolean Wczytaj(String nplik) {
      boolean koniecPliku = false,  prawdWPliku = false;
      String szyld = null, s1, s2;
      int i;
      BufferedReader in = null;
      try {
         in = new BufferedReader(new FileReader(nplik));
      }
      catch(FileNotFoundException e) {
         System.out.println("Nie znaleziono pliku "+nplik);
         Powiadom("Nie znaleziono pliku "+nplik);
         return false;
      }
      IndriScanfX sc = new IndriScanfX( in );
      boolean przekszt = false;
      try {
         szyld = sc.pobierzLinie();
      } catch(IOException e) {}
      Tnazw.setText(szyld);
      s1 = null; s2 = null;
      try {
         for(i = 0; i < 6; i++) {
            s1 = sc.czytStr();
            if(s1.equalsIgnoreCase("Skurcz:") ) {
               s2 = sc.czytStr();
               Tskurcz.setText(s2);
               continue;
            }
            if(s1.equalsIgnoreCase("Beta:") ) {
               s2 = sc.czytStr();
               Tbeta.setText(s2);
               continue;
            }
            if(s1.equalsIgnoreCase("AlfaPocz:") ) {
               s2 = sc.czytStr();
               TalfaPocz.setText(s2);
               continue;
            }
            if(s1.equalsIgnoreCase("Iteracji:") ) {
               s2 = sc.czytStr();
               Tpozrek.setText(s2);
               continue;
            }
            if(s1.equalsIgnoreCase("KrokPocz:") ) {
               s2 = sc.czytStr();
               TkrokPocz.setText(s2);
               continue;
            }
            if(s1.equalsIgnoreCase("Przekszt:") ) {
               czytajPrzekszt(sc);
            }
         } // end of for
      }
      catch(IOException e) {
         Powiadom("Błąd czytania pliku\n"+e);
         System.exit(1);
      }
      try {
        in.close();
     } catch(IOException e1) { }
      return true;
   }
   void czytajPrzekszt(IndriScanfX sc ) {
      ArrayList al0 = new ArrayList<String>();
      String wyn, w0 = null; int i, k=0;
      boolean koniec = false;
      while( !koniec) {
         try {
            w0 = sc.pobierzLinie();
         } catch(IOException e) {}
         if( w0 == null) {
            koniec = true;
         } else {
            if(w0.equalsIgnoreCase("KonPrzekszt:") ) {
               koniec = true;
            } else {
               al0.add(w0); k++;
            }
         }
      }
      StringBuffer sb = new StringBuffer();
      for(i = 0; i < k; i++) {
         sb.append(al0.get(i) );
         sb.append("\n");
      }
      wyn = new String(sb);
      Regl.setText(wyn);
   }
   public static void main( String[] args ) {
      boolean test = false;
      for(int i = 0; i < args.length; i++)  {
         if( args[i].compareToIgnoreCase("test") == 0 ) {
           test = true;
           break;
        }
      }
      File fbyk = new File("$qlsyst.err");
      FileOutputStream fs = null;
      if(test) {
         try {
            fs = new FileOutputStream(fbyk);
         } catch(FileNotFoundException e) {}
         PrintStream ps = new PrintStream(fs);
         System.setErr(ps );
      }
      Qlsyst qls = new Qlsyst(60, 0.333, test );
      qls.setTitle("L-systemy");
   }
}
Dodaj komentarz