Kreis ausgeben in Sternchen

Status
Nicht offen für weitere Antworten.

buergi

Neues Mitglied
Hallo

Ich muss als Aufgabe eine Anwendung in JAVA schreiben welche, in der Konsole einen Kreis in Sternchen ausgibt. Kein Applet.

Ich habe mir überlegt, dass man Zeile für Zeile abarbeiten muss, wenn man einen Kreis in Sternchen ausgeben möchte. Leider habe ich bis jetzt noch kein erfräuliches Ergebnis. Hab es mir schon mit dem cosinus etc. überlegt,.
Habt Ihr vielleicht irgendwelche Lösungen?


Besten Dank schonmals im Voraus
 

Leroy42

Top Contributor
Definiere dir einen 2-dimensionalen char-Array in der Art
Code:
char[][] schirm = new char[Zeilen][Spalten]
und füllst ihn mit Blanks.

Dann definierst du den Kreismittelpunkt auf x0=Spalten/2, y0=Spalten/2 und den Radius gleich Spalten/2
durchläufst eine Schleife für den Winkel von 0 bis 360 in Einerschritten.

Die Schrittweite könnte auch größer sein, aber was soll der Geiz :cool:

In der Schleife berechnest du die Kreispunkte x,y mittels Sinus und Cosinus und
setzt den zugehörigen char-Wert: schirm[x][y] = '*'.

Danach brauchst du nur noch dein char-Array zeilenweise ausgeben.
 

norman

Top Contributor
cosinus ist hier die flasche wahl, da du auf der konsole sowieso nicht so genau darstellen kannst. vermutlich soll der durchmesser (einheit: sternchen?) übergeben werden.
was du brauchst ist eine schleifenkonstruktion, die dir in abhängigkeit vom durchmesser leerzeichen und sternchen auf die konsole schreibt.
 

Murray

Top Contributor
Leroys Idee mit dem zweidimensionalen Array finde ich ganz gut; damit wird das ziemlich übersichtlich, weil man a) die Berechung der Kreispunkte von der Ausgabe trennen kann und b) das auch ganz trivial auf eine echte graphische Darstellung erweitern kann.

Trigonometrische Funktionen kann man sich hier aber wohl wirklich sparen; wenn ich mich recht erinnere (Schule und Studium sind bei mir schon ziemlich lange her), dann reicht hier doch die Kreisgleichung.
 

Murray

Top Contributor
Wenn nicht nur der Kreisradius, sondern ein ausgefüllter Kreis gezeichnet werden soll, dann ist es auch mit dem von Norman vorgeschlagenen Weg recht einfach: man hat zwei verschachtelte Schleifen (über die Zeilen und die Spalten) und prüft dann für jeden Punkt, ob er der Kreisbedingung genügt: eine Punkt (x:y) liegt dann innerhalb des Kreises mit dem Radius r, wenn gilt: x*x + y*y <= r*r.
 

Leroy42

Top Contributor
Stimmt :shock:
Mit der Kreisgleichung in der Form
Code:
(x-x0)² + (y-y0)² = r²
<==> (x-x0) = +- sqrt(r² - (y-y0)²)
<==> x = x0 +- sqrt(r² - (y-y0)²)
kommt man mit Durchlaufen der Zeilennummern als y-Werte viel einfacher zum Ergebnis.

Und das auch noch mindestens 42 Nanosekunden schneller :cool:
 
B

Beni

Gast
Wie funktioniert das, wenn man nur den Ring haben will? Vielleicht (x-x0)² + (y-y0)² = r² +- 1 ?
 

lin

Top Contributor
...wenn r = 1 ... :shock:

edit: hehe muss ja auch super aussehen auf der Konsole ein Kreis mit Radius 1 als Sternchen ausgeben ... ... ...
 

Leroy42

Top Contributor
Noch ein Nachtrag:

Ich habe zuhause mal beide Varianten ausprobiert; meine mit sin/cos und Murray's mit Wurzel.
Ich hatte zwar auch Murray's Vorschlag favorisiert, aber wir haben beide wohl nicht bedacht,
daß dort für jede Zeile (y-Koordinate) nur 2 Werte (x-Koordinaten) geliefert werden. Der Kreis
sieht dadurch ziemlig löchrig aus.

Die sin/cos-Variante erzeugt auch mehre Sternchen pro Zeile, so daß der Kreis voller wirkt
und besser aussieht.

Leroy42 hat gesagt.:
Und das auch noch mindestens 42 Nanosekunden schneller :cool:
Der genaue Wert bei meiner 2 GHz-Tüte beträgt 127 µs
Das heißt man merkt den Unterschied erst, wenn man vom Monitor 38 km entfernt sitzt :autsch:
 

norman

Top Contributor
Leroy42 hat gesagt.:
Der genaue Wert bei meiner 2 GHz-Tüte beträgt 127 µs
Das heißt man merkt den Unterschied erst, wenn man vom Monitor 38 km entfernt sitzt :autsch:
was ist das denn für eine logik? :shock:

auch aus 29034820948km wirst du das 2. ergebnis (theor.) exact 127µs später sehen als du das 1. sehen würdest. ???:L
 

Leroy42

Top Contributor
Stimmt natürlich!

Entweder ist heute nicht mein Tag, oder ich treibe mich zu viel im Physik-Forum rum :shock:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben