# Kreis ausgeben in Sternchen



## buergi (19. Apr 2006)

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


----------



## Beni (19. Apr 2006)

http://www.java-forum.org/de/viewtopic.php?t=16921

*verschoben nach Aufgaben und Gesuche*


----------



## Leroy42 (19. Apr 2006)

Definiere dir einen 2-dimensionalen char-Array in der Art

```
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   

In der Schleife berechnest du die Kreis_punkte_ 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 (19. Apr 2006)

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 (19. Apr 2006)

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 (19. Apr 2006)

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 (19. Apr 2006)

Stimmt  :shock: 
Mit der Kreisgleichung in der Form

```
(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


----------



## Beni (19. Apr 2006)

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


----------



## Leroy42 (19. Apr 2006)

Beni hat gesagt.:
			
		

> Vielleicht (x-x0)² + (y-y0)² = r² +- 1 ?



Wenn schon, dann (r +- 1)², sonst siehst du nicht viel


----------



## lin (19. Apr 2006)

...wenn r = 1 ...  :shock: 

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


----------



## Leroy42 (20. Apr 2006)

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


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 (20. Apr 2006)

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 (20. Apr 2006)

Stimmt natürlich!

Entweder ist heute nicht mein Tag, oder ich treibe mich zu viel im Physik-Forum rum  :shock:


----------

