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"); } }