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

