Witam:) Mam problem z funkcją rysującą. Rysowanie napisałem na podstawie metody paintComponent(Graphics g). Jednak wewnątrz niej wywołuję inną funkcję drawTree() która zawiera polecenia rysowania. Nie są one jednak wywoływane...
import java.awt.*;
import java.util.Random;
import javax.swing.*;
public class Drzewo extends JPanel
{
// FRAKTAL OBJECTS
private Random random = new Random();
private Point origin;
private String tree;
private Graphics graphics;
private int axiomIndex;
private int branchLength;
private int branchAngle;
// *** C O N S T R U C T O R *** //
public Drzewo()
{ initialization(); }
// ***************************************************************** //
// ******************** C L A S S M E T H O D S ********************* //
// ***************************************************************** //
private void initialization()
{
tree = "F[[F]F]FF[[F[[F]F]FF]F[[F]F]FF]F[[F]F]FFF[[F]F]FF";
System.out.println(tree.toString());
System.out.println(tree.length());
axiomIndex = 0;
branchLength = 6;
branchAngle = 20;
}
private void drawTree(int x0, int y0, double angle, double length, Graphics graphics)
{
while(axiomIndex < tree.length())
{
// boczna gałąź mniejsza od głównej
length = length * 0.95;
char axiom = tree.charAt(axiomIndex);
++axiomIndex;
if(axiom == 'F')
{
// losowa zmiana kąta nachylenia gałęzi
angle += (random.nextInt() % 6) * ((-1) ^ random.nextInt())
+ (random.nextInt() % 10) * ((-1) ^ random.nextInt()) * 0.1;
// wyznaczenie współrzędnych punktu zaczepienia gałęzi
int x = (int) (x0 + length * Math.cos(angle * Math.PI / 180));
int y = (int) (y0 + length * Math.sin(angle * Math.PI / 180));
// wywołanie funkcji rysującej gałąź
// TA FUNKCJA NIE DZIAŁA - PANEL NIE RYSUJE GAŁĘZI
graphics.drawLine(origin.x + x0, origin.y - y0, origin.x + x, origin.y - y);
x0 = x;
y0 = y;
}
if(axiom == '[')
{
// gałąź - raz w lewo, raz w prawo
branchAngle = branchAngle * ((-1) ^ random.nextInt());
drawTree(x0, y0, angle + branchAngle, length, graphics);
}
if(axiom == ']') return;
}
repaint();
}
public void paintComponent(Graphics g)
{
graphics = g;
super.paintComponent(graphics);
// przeniesienie środka układu współrzędnych
origin = new Point(getWidth()/2, getHeight()/2);
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, getWidth(), getHeight());
graphics.setColor(Color.BLACK);
/*wydruk kontrolny, funkcja drawLine działa w tym miejscu
chociaż NIE DZIAŁA przy wywołaniu wewnątrz funkcji drawTree(...)
graphics.drawLine(origin.x, origin.y, 50, 50);*/
drawTree(0, 0, 90, branchLength, graphics);
}
public static class Draw extends JFrame
{
private Drzewo sines = new Drzewo();
public Draw()
{ add(sines); }
public static void main(String[] args)
{ SwingConsole.run(new Draw(), 700, 400); }
}
}
Zapomniałem o jakimś elemencie, czy to wymaga przerobienia? Łatwiej przerobić to, gdyby chodziło o wywołanie iteracyjne. Ale mam polecenie wywoływać drawTree() rekurencyjnie.