11: Schleifen 4 – Zeichnen von verschachtelten Figuren

 

Zeichnen Sie die folgende Figur. Dabei wird das Basisobjekt jeweils in horizontaler Richtung n-mal unter Beibehaltung der Größe sowie in vertikaler Richtung m-mal unter Halbierung der Größe wiederholt:

Lösung

Zur Lösung dieser Aufgabe wird die Datei unibwm.jar benötigt. Sie kann in der Eclipse Umgebung in den Projektoptionen unter “add external jar” hinzugefügt werden.

import java.util.Scanner; 	// Scanner für die Eingabe von Werten
import unibwm.*;			// Grafik für die Ausgabe der Objekte

public class Aufgabe11
{
	public static void main(String[] args)
	{
		// Variablen Deklaration
		Grafik gfkZeichnung = new Grafik();
		Scanner scnEingabe = new Scanner(System.in);
		int iAnzahlHorizontal, iAnzahlVertikal;
			// Abmessungen des Grundobjektes
		double dStartBreite, dStartHoehe;
			// Skalierte Abmessungen des Grundobjektes und aufsummierte Höhe
		double dAktuelleHoehe, dAktuelleBreite, dGesamtHoehe;

		// Variablen Initialisierung
		dGesamtHoehe = 0;
		System.out.print("Bitte horizontale Anzahl eingeben: ");
		iAnzahlHorizontal = scnEingabe.nextInt();
		System.out.print("Bitte Startbreite eingeben: ");
		dStartBreite = scnEingabe.nextDouble();
		System.out.print("Bitte vertikale Anzahl eingeben: ");
		iAnzahlVertikal = scnEingabe.nextInt();
		System.out.print("Bitte Starthöhe eingeben: ");
		dStartHoehe = scnEingabe.nextDouble();

		dAktuelleHoehe = dStartHoehe;
		dAktuelleBreite = dStartBreite;

		for (int i = 0; i < iAnzahlVertikal; ++ i)
		{ // Äußere Schleife für vertikalen Durchlauf
			if (i > 0) // ab dem zweiten Schritt Änderung der Höhe und Breite
			{
				dGesamtHoehe += dStartHoehe / Math.pow(2, i-1);
				dAktuelleHoehe /= 2.;
				dAktuelleBreite /= 2.;
			} // end if

			// Durchgängige horizontale Linie
			gfkZeichnung.addLine(0, dGesamtHoehe+dAktuelleHoehe,
						dStartBreite * iAnzahlHorizontal,
						dGesamtHoehe+dAktuelleHoehe);

			for (int j = 0; j < iAnzahlHorizontal * Math.pow(2, i); ++ j)
			{ // innere Schleife für horizontalen Durchlauf
				double x1, x2, y1, y2;
				x1 = dAktuelleBreite * j;
				x2 = dAktuelleBreite * (j+1);
				y1 = dGesamtHoehe;
				y2 = dGesamtHoehe+dAktuelleHoehe;

				gfkZeichnung.addLine(x1, y1, x2-dAktuelleBreite / 2., y2);
				gfkZeichnung.addLine(x2, y1, x2-dAktuelleBreite / 2., y2);
				gfkZeichnung.addLine(x1, y1, x1, y2);
				gfkZeichnung.addLine(x2, y1, x2, y2);
			} // end for j
		} // end for i

		gfkZeichnung.show("Ausgabe zu Aufgabe 11");
	} // end main
} // end class