[Rysowanie] w oparciu o lsystemy

0

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.

0

A jakiej klasy Point używasz? Nie może to być klasa standardowa, bo w niej zapis origin.x jest niedopuszczalny.

0

java.awt.Point

Współrzędne zmieniają się niby zgodnie z założeniami... Ale nie wiem, myślałem że nie rysuje, bo wychodzą poza zakres, ale z tego co mi wyświetlało to mieszczą się w zakresie Panela ;]

0

Z klasą Point trochę namieszałem, na mojej maszynie kompilator widział moją klasę Point, w której pola x,y są prywatne.
Jeśli chodzi o rysowanie, to wszystko się rysuje ale Ty (ja zresztą też) masz za wolne oko by to zobaczyć.
Funkcja drawTree() jest tak napisana, że tylko przy przy pierwszym wywołaniu coś rysuje, a powinna przy każdym. Wprowadziłem do niej dwie zmiany: dodałem parametr logiczny zeruj i wyrzuciłem parametr graphics (skoro graphics jest polem w klasie, to nie ma potrzeby (a nawet sensu) go przekazywać).

        private void drawTree(int x0, int y0, double angle, double length,boolean zeruj)
        {
            if(zeruj)
            {
                axiomIndex = 0;
            }
                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,false);
                        }

                        if(axiom == ']')
                        {
                            return;
                        }
                }
                //repaint();
        }

wywołanie tej funkcji wygląda tak

drawTree(0, 0, 90, branchLength,true);
0

Wszystko działa, podziękował :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1