Rechtecke rekursiv zeichnen

kantolyo123

Mitglied
Ich möchte ein Rechteck zeichnen und dieses dann immer weiter halbieren an der längeren Seite, so dass immer weitere kleinere Rechtecke innerhalb des ersten entstehen. Bin mir aber noch nicht ganz sicher wie ich das machen kann und möchte euch daher um Hilfe bitten. Bisher bin ich soweit:
Code:
public class Rechteck {
  public static void zeichneRechteck(double a,double b) {
   a=0.9;
   b=0.7;
   StdDraw.line(0.2,0.2,0.2,a);
   StdDraw.line(0.2,a,b,a);
   StdDraw.line(b,a,b,0.2);
   StdDraw.line(b,0.2,0.2,0.2);
}
  public static void zeichne(double n, double a, double b) {
   if(n==0) return;
   zeichneRechteck(a,b);

   zeichne(n-1,a,b);
}
  public static void main(String[]args) {
   int n=Integer.parseInt(args[0]);
   double a=0.9;
   double b=0.45;
   zeichne(n,a,b);
}
}

Bisher entsteht nur das erste Rechteck und kein weiteres innerhalb des ersten.
 

Joose

Top Contributor
Logisch in deiner Methode "zeichneRechteck" hast du die Parameter a und b, für beide setzt du immer die gleichen Werte. Daher wird jedes Reckteck genau über dem vorherigen gezeichnet. Für dich schaut es nach nur einen aus. -> a und b nicht auf einen fixen Wert setzen.

Was bei dir fehlt ist das halbieren einer Seite (egal welche der beiden, aber nicht beide)
 

kantolyo123

Mitglied
Erst einmal vielen Dank für deine Antwort! Das heißt also, ich brauche a und b nicht weiter definieren, aber das erste Rechteck muss ich schon mit konkreten Zahlen zeichnen, oder? Wo genau muss ich die Seite halbieren?
 

Joose

Top Contributor
...... Das heißt also, ich brauche a und b nicht weiter definieren, aber das erste Rechteck muss ich schon mit konkreten Zahlen zeichnen, oder?
Natürlich brauchst du Anfangswerte für a und b. Diese legst du auch in der main Methode fest.
Danach musst du aber nur noch die Werte halbieren. Praktisch wäre es hier a und b abwechselnd zu halbieren (Tipp: abhängig von n).

Wo genau muss ich die Seite halbieren?
Dort wo es Sinn ergibt ;)
Überlege was dein Program aktuell macht und wo es Sinn macht eine der Längen zu halbieren.
 

kantolyo123

Mitglied
Jetzt brauche ich doch noch einmal deine Hilfe. Habe es jetzt hinbekommen, dass das Rechteck an der langen Seite geteilt wird, aber leider nicht genau durch die Hälfte, sodass zwei gleich große Rechtecke entstehen. Leider verstehe ich (noch) nicht, warum das so ist.
Ich möchte im nächsten Schritt dann auch das Rechteck abwechselnd durch a und b teilen, so dass unmittelbar nach der Teilung zwei gleich große Rechtecke entstehen. Du hast gesagt, das ist von n abhängig. Heißt das, dass ich eine if Schleife machen muss mit einmal geraden Zahlen und einmal ungeraden Zahlen? Aber wie genau kann ich das deklarieren? Oder bin ich jetzt komplett auf dem Holzweg?
 

Joose

Top Contributor
Habe es jetzt hinbekommen, dass das Rechteck an der langen Seite geteilt wird, aber leider nicht genau durch die Hälfte, sodass zwei gleich große Rechtecke entstehen. Leider verstehe ich (noch) nicht, warum das so ist.

Was heißt nicht genau durch die Hälfte? Hast du dir auf der Konsole die Werte ausgeben lassen welche der Reihe nach berechnet werden. Wie schaut dein Code aus? Wie halbierst du?
double und float sind ungenau und können nicht immer "genau" halbiert werden, aber das sollte nicht so groß ins gewicht fallen.

Ich möchte im nächsten Schritt dann auch das Rechteck abwechselnd durch a und b teilen, so dass unmittelbar nach der Teilung zwei gleich große Rechtecke entstehen. Du hast gesagt, das ist von n abhängig. Heißt das, dass ich eine if Schleife machen muss mit einmal geraden Zahlen und einmal ungeraden Zahlen? Aber wie genau kann ich das deklarieren?

Bezüglich der "if-Schleife" => http://if-schleife.de/

Genau abhängig von davon ob n gerade oder ungerade ist kannst du eben a oder b halbieren.
Dazu diesen Link: https://www.google.at/search?q=java...-8&oe=utf-8&gws_rd=cr&ei=tDdxVq2wLofXUcHUr-AG
 

kantolyo123

Mitglied
Sorry, habe vergessen den Code anzuhängen.
Java:
public class Rechteck {
  public static void zeichneRechteck(double a,double b) {
   StdDraw.line(0.2,0.2,0.2,a);
   StdDraw.line(0.2,a,b,a);
   StdDraw.line(b,a,b,0.2);
   StdDraw.line(b,0.2,0.2,0.2);
}
  public static void zeichne(double n, double a, double b) {
   if(n==0) return;
   zeichneRechteck(a,b);

   zeichne((n-1),a/2,b);
}
  public static void main(String[]args) {
   int n=Integer.parseInt(args[0]);
   double a=0.9;
   double b=0.7;
   zeichne(n,a,b);
}
}
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Naja du zeichnest eigentlich kein Rechteck sondern 4 Linien welche ein Reckteck ergeben sollen.
Da ich die Klasse "StdDraw" nicht kenne und weiß was sie (und ihre Methoden) genau machen bzw. welche Parameter sie haben wollen ist es schwer zu sagen warum er dir nicht genau halbiert.

PS: Ein Screenshot davon wäre praktisch, dann kann man sich es auch in etwa vorstellen
 

Joose

Top Contributor
Schau dir doch mal genau an welche Parameter die Methode "line" erwartet.
Dann schau dir deinen Code an:

Java:
public static void zeichneRechteck(double a,double b) {
   StdDraw.line(0.2,0.2,0.2,a); // 1.Linie
   StdDraw.line(0.2,a,b,a); // 2.Linie
   StdDraw.line(b,a,b,0.2); // 3.Linie
   StdDraw.line(b,0.2,0.2,0.2); 4.Linie
}

Du zeichnest deine 4 Linien schon mit einem Grundabstand zum Rand ... diesen Grundabstand musst du bei a und b miteinbeziehen!
 

kantolyo123

Mitglied
Danke, das klappt jetzt. Das Rechteck wird genau durch die Hälfte geteilt. Habe jetzt am Rand angefangen. Jetzt möchte ich aber das das Rechteck bei der nächsten Teilung wieder durch die längere Seite geteilt wird und so ein kleineres Rechteck entsteht.
Die if Abfrage habe ich folgendermaßen gemacht:
Code:
if((b%2)==0)
   zeichne((n-1),a,b/2);
   else
   zeichne((n-1),a/2,b);
Das Bild sieht aber so aus: Ich möchte aber, dass die untere der beiden inneren Linien senkrecht verläuft und so das Rechteck noch einmal teilt.
 

Anhänge

  • IMG_0101.JPG
    IMG_0101.JPG
    2,5 MB · Aufrufe: 29

kantolyo123

Mitglied
Das habe ich völlig übersehen. Jetzt habe ich aber noch eine Frage: wenn ich eine gerade Zahl n eingebe, wird zuerst die kürzere Seite geteilt und es entstehen in die Länge gezogene Rechtecke. Warum ist das so? Hatte erwartet, dass die Rechtecke von der Form her gleich aussehen. Im Foto die Eingabe n=4. Und wie kann ich es ändern, dass auch bei der Eingabe einer geraden Zahl immer die längere Seite halbiert wird? Vielleicht mit einer weiteren if Bedingung?
 

Anhänge

  • IMG_0102.JPG
    IMG_0102.JPG
    2,6 MB · Aufrufe: 35

Joose

Top Contributor
Du könntest auch unabhängig von n entscheiden welche Seite du kürzen willst.
Einfach schauen welche der beiden Seiten länger ist und eben die längere kürzen/halbieren. Dann sollte es keine lang gezogene Recktecke mehr vorkommen.
 

kantolyo123

Mitglied
Und wie gestalte ich das unabhängig von n? Wie kann ich abfragen, welche Seite länger ist? Vielleicht mit if(a>b)%2==0? Aber da bekomme ich einen Fehler vom Compiler.
 

Joose

Top Contributor
Und wie gestalte ich das unabhängig von n? Wie kann ich abfragen, welche Seite länger ist?

Bitte lies dir meinen letzten Beitrag aufmerksam durch, dort steht eigentlich genau beschrieben wie es funktioniert :)

Vielleicht mit if(a>b)%2==0? Aber da bekomme ich einen Fehler vom Compiler.

Logisch weil es syntaxisch völlig falsch ist. Außerdem willst du ein boolean (a>b) mit %2 berechnen. Das %2 == 0 war nur fürs "n" gedacht da sich dies bei jedem Durchlauf der Methode um 1 verringert hat.
 

kantolyo123

Mitglied
Musste zwischenzeitlich noch etwas anderes erledigen, deswegen hat es diesmal etwas länger gedauert bis zu meiner Antwort. Habe jetzt die Lösung, indem ich das mit einer if Bedingung gemacht habe, was du mir gesagt hast. Vielen Dank für deine Geduld und die super Hilfe!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Kollision zweier Rechtecke, Schnittpunkte bestimmen Java Basics - Anfänger-Themen 25
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
K zwei Rechtecke auf Berührung prüfen Java Basics - Anfänger-Themen 2
S mehrere Rechtecke in ein Panel Java Basics - Anfänger-Themen 2
M flaeche 2er schneidender rechtecke Java Basics - Anfänger-Themen 6
S Rechtecke zu moeglichst groesseren Rechtecken kombinieren? Java Basics - Anfänger-Themen 7
L rechtecke zeichnen anhand von matrix Java Basics - Anfänger-Themen 27
B wie kann man mehrere rechtecke erzeugen? Java Basics - Anfänger-Themen 3
I Kollision zweier Rechtecke Java Basics - Anfänger-Themen 9
H Rechtecke, Quadrate. Was soll ich machen? Java Basics - Anfänger-Themen 2
J rechtecke als hintergrund / thread Java Basics - Anfänger-Themen 4
S Gezeichnete Rechtecke werden nicht dargestellt Java Basics - Anfänger-Themen 15
A Schnitt zweier Rechtecke ermitteln Java Basics - Anfänger-Themen 2
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
T Rekursiv Vokale zählen Java Basics - Anfänger-Themen 19
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
S Stringlänge Rekursiv ermitteln Java Basics - Anfänger-Themen 2
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben