Berechnung eines ausgefüllten Kreises in einem Array
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.
-
-
-
Crazydrift schrieb:
Hintergrund ist eine 2D World Map, aber ich kenne keine passende Formel.
Pic:
Die Welt wird durch das Array gezeichnet.
Einen nicht ausgefüllten Kreis bekomme ich durch:
VB.NET-Quellcode
- Public Shared Sub Circle(a As Double, b As Double, r As Double, block As Blocks)
- ' Zeichnet einen Kreis mit Radius r um den Mittelpunkt (a, b), wobei n Punkte gesetzt werden
- Dim n As Integer = 5
- Dim pi As Double = 3.141
- Dim w As Double = 0
- Dim s As Double = 2 * Math.PI \ n
- For i As Integer = 1 To n * 100
- w += s
- Try
- World(CInt(a + r * Math.Cos(w)), CInt(b + r * Math.Sin(w))) = block
- Catch ex As Exception
- End Try
- Next
- End Sub
-
dann mach dirn Array mit Index-Positionen und zeichne dann entsprechend der Index-Position deine Sachen.
Also:
Und dann musst du nurnoch an X, Y den Inhalt von i zeichnen. -
-
du füllst das Array mit deinen Items und whatever du da drin haben willst.
Für index 0 = Luft, 1 = Erde, 2 = Kopf, 3 = Körper oben, 4 = Beine
Dann musst du "nur" die Items durchlaufen und die Sachen entsprechend zeichnen.
-
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@AliveDevil
Ich glaube du hast die Frage falsch verstanden...
In der Map-Generation am Anfang brauche ich eine tools, um z.b. einen kreis aus sand in den boden zu "malen".
Das Array besteht aus id's, ca. so:
111111000432222
111994442211145
558237619433333
Und diese Zahlen werden dann eben immer durch block-texturen ersetzt und gezeichnet, alles kein Problem. Nun will ich aber in so ein Zahlen-Array "Kreise" einfügen. Das würde ca. so aussehen:
0000000000
0000110000
0001111000
0001111000
0000110000
0000000000
@RodFromGermany
Nein, sowas meine ich nicht, übrigens arbeite ich nicht mit GDI+, sondern mit XNA, das ist aber völlig egal. Ich will lediglich einen "Kreis" in ein Array zeichnen, das habe ich zwar schon geschafft, dieser ist aber leider nicht ausgefüllt, sondern innen leer. -
-
Crazydrift schrieb:
dieser ist aber leider nicht ausgefüllt, sondern innen leer.
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
-
Ich hab's aus Spaß mal als Console-App geschrieben:
Spoiler anzeigen VB.NET-Quellcode
- Option Strict On
- Module KreisArray
- Private Structure Punkt
- Dim x As Integer
- Dim y As Integer
- End Structure
- Sub Main()
- ''==================================================
- ''Deklartation
- Dim Array(20, 20) As Boolean
- Dim Mittelpunkt As Punkt
- Mittelpunkt.x = CInt(Math.Floor(Array.GetLength(0) / 2)) 'Mittelpunkt des Kreises auf Mitte des Arrays festlegen
- Mittelpunkt.y = CInt(Math.Floor(Array.GetLength(1) / 2)) 'Mittelpunkt des Kreises auf Mitte des Arrays festlegen
- Const Radius As Integer = 5
- Const AusgabeChar As Char = "#"c
- ''==================================================
- ''Kreis in das Array schreiben
- For x As Integer = Mittelpunkt.x - Radius To Mittelpunkt.x + Radius
- For y As Integer = Mittelpunkt.y - Radius To Mittelpunkt.y + Radius
- If ((x - Mittelpunkt.x) ^ 2 + (y - Mittelpunkt.y) ^ 2) < Radius ^ 2 Then
- Array(x, y) = True
- End If
- Next
- Next
- ''==================================================
- ''Array in Console ausgeben
- For x As Integer = 0 To Array.GetLength(0) - 1
- For y As Integer = 0 To Array.GetLength(1) - 1
- If Array(x, y) = True Then
- Console.ForegroundColor = ConsoleColor.DarkGreen
- Else
- Console.ForegroundColor = ConsoleColor.Gray
- End If
- Console.SetCursorPosition(x, y)
- Console.Write(AusgabeChar)
- Next
- Next
- ''==================================================
- ''Mittelpunkt in Console ausgeben
- Console.ForegroundColor = ConsoleColor.Red
- Console.SetCursorPosition(Mittelpunkt.x, Mittelpunkt.y)
- Console.Write(AusgabeChar)
- Console.ReadKey()
- End Sub
- End Module
//EDIT: BTW Warum gibt Math.Floor keinen Integer zurück -
-
-
Nein - eigentlich nur in Codes, die zur Veranschaulichung von Sachverhalten dienen, um Codeabschnitte getrennter Funktionalität untereinander strukturiert zu differenzieren. Mir fällt spontan kein Argument ein, das dagegen spricht, oder zählst du die paar Bytes Speicherplatz, die durch die Zeilenumbrüche verloren gegangen sind?
Wenn du ein Problem damit hast, "anfängerfreudlich" strukturierten Code zu lesen, lässt du in Zukunft einfach den Expander zu. Dass du als extrem erfahrener User mit wesentlich Anspruchsvollerem klar kommst, stellt hier niemand in Abrede. Dem TE wurde scheinbar mit diesem Ansatz weitergeholfen. Die (folglich unnötige) Beschwerde über die Formatierung erscheint als Trollerei. -
Ich hab nix gegen Leerzeilen, nur gegen die sinnlosen. Guck, so hätte ich formatiert, und halte ich für besser lesbar:
VB.NET-Quellcode
- Option Strict On
- Module KreisArray
- Private Structure Punkt
- Dim x As Integer
- Dim y As Integer
- End Structure
- Sub Main()
- Const Radius As Integer = 5
- Const AusgabeChar As Char = "#"c
- Dim Array(20, 20) As Boolean
- Dim Mittelpunkt As Punkt
- Mittelpunkt.x = CInt(Math.Floor(Array.GetLength(0) / 2)) 'Mittelpunkt des Kreises auf Mitte des Arrays festlegen
- Mittelpunkt.y = CInt(Math.Floor(Array.GetLength(1) / 2)) 'Mittelpunkt des Kreises auf Mitte des Arrays festlegen
- ''Kreis in das Array schreiben
- For x As Integer = Mittelpunkt.x - Radius To Mittelpunkt.x + Radius
- For y As Integer = Mittelpunkt.y - Radius To Mittelpunkt.y + Radius
- If ((x - Mittelpunkt.x) ^ 2 + (y - Mittelpunkt.y) ^ 2) < Radius ^ 2 Then
- Array(x, y) = True
- End If
- Next
- Next
- ''Array in Console ausgeben
- For x As Integer = 0 To Array.GetLength(0) - 1
- For y As Integer = 0 To Array.GetLength(1) - 1
- If Array(x, y) = True Then
- Console.ForegroundColor = ConsoleColor.DarkGreen
- Else
- Console.ForegroundColor = ConsoleColor.Gray
- End If
- Console.SetCursorPosition(x, y)
- Console.Write(AusgabeChar)
- Next
- Next
- ''Mittelpunkt in Console ausgeben
- Console.ForegroundColor = ConsoleColor.Red
- Console.SetCursorPosition(Mittelpunkt.x, Mittelpunkt.y)
- Console.Write(AusgabeChar)
- Console.ReadKey()
- End Sub
- End Module
Ich seh halt oft so viele sinnlose Leerzeilen, da nehme ich an, diese komische Unsitte guckt einer vom anneren ab.
Dabei ist beim Coden immer auch wichtig, dass man möglichst viel in einem Blick hat, und dass was zusammen-gehört, auch als solches erkenntlich ist.
Und Leerzeilen haben den Sinn, verschiedene Bereiche, deren Zeilen je enger zusammengehören, bischen optisch voneinander abzugrenzen.
Aber da reicht eine Zeile - es soll ja auch noch erkennbar bleiben, dass das alles in derselben Methode stattfindet. -
FuFu^^ schrieb:
Warum gibt Math.Floor keinen Integer zurück
Dafür gibt es dier Funktion Convert.ToInt()Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
-
Ähnliche Themen
-
Tobi7996 - - Sonstige Problemstellungen
-
Pit905 - - Sonstige Problemstellungen
-
4 Benutzer haben hier geschrieben
- Gast (9)
- fufu (4)
- RodFromGermany (3)
- ErfinderDesRades (2)