myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [JAVA] Rechteckschachtelung (https://mygully.com/showthread.php?t=2726500)

Underkane 13.10.12 21:17

[JAVA] Rechteckschachtelung
 
Aufgabenstellung: Rechteckschachtelung

Eine Fläche soll mit Rechtecken gefüllt werden, dass ein Rechteck zwei Rechtecke enthält. Jedes dieser Rechtecke enthält wieder zwei Rechtecke usw. Damit die Rechtecke unterschiedlich geschachtelt werden und unterschiedliche Farben besitzen, sollen die Teilungsstelle und die Farbe jeweils per Zufall ermittelt werden.


So wie ich den Text verstanden habe, soll ein Rechteck erstellt werden, das zwei Rechtecke enthält, die wieder je zwei Rechtecke enthalten, usw.
Ob die Teilung horizontal oder vertikal sowie in welcher Farbe erfolgt soll zufällig sein.
http://imageshack.us/a/img266/8449/entwurf.jpg

Mir fehlt jedoch der richtige Ansatz um das zu lösen.

Was ich bis jetzt habe:
Code:

import javax.swing.JFrame;

public class Main extends JFrame {
    final static int WINDOW_WIDTH = 800, WINDOW_HEIGHT = 600;
   
    public Main() {
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new Controller());
        setVisible(true);
    }
   
    public static void main(String[] args) {
        new Main();
    }
}

Code:

import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Color;

public class Controller extends JPanel implements ActionListener {
    public Controller() {
        Timer timer = new Timer(1000, this);
        timer.start();
    }
   
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, Main.WINDOW_WIDTH, Main.WINDOW_HEIGHT);
    }
   
    public void actionPerformed(ActionEvent e) {
        //teilen
    }
}

Code:

import java.awt.Graphics;
import java.awt.Color;

public class Rectangle {
    private int x, y;
    private int width, height;
   
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
   
    public void paint(Graphics g) {
        //farbe g.setColor(Color.WHITE);
        g.fillRect(x, y, width, height);
    }
   
    public int getX() {
        return x;
    }
   
    public int getY() {
        return y;
    }
   
    public int getWidth() {
        return width;
    }
   
    public int getHeight() {
        return height;
    }
}


d03jo4n 13.10.12 22:42

Das ganze könntest du rekursiv lösen.
Dafür solltest du beim repaint auf jeden Fall double buffering verwenden.

In der rekursiven Methode solltest du
  • entscheiden, wie geteilt wird (horizontal/vertikal) und
  • die Breite eines Feldes ermitteln (Zufall) und die andere bestimmen

Danach rufst du die Methode dann rekursiv für jedes Teilrechteck auf.
Dafür kannst du die von dir geschriebene Klasse Rectangle verwenden.
Die rekursive Methode könnte also zum Beispiel folgende Signatur haben:

Code:

protected void split(Rectangle rect)
Wichtig: Du brauchst eine Verschachtelungstiefe, damit das ganze nicht endlos läuft!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.