Fehler in der Matrix

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

gameworx

Betreff: Fehler in der Matrix

BeitragDo, Jul 22, 2010 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum zeigt mir die draw_matrix Funktion andere Punkte als die create_matrix Funktion? Die sollten doch eigentlich identisch sein.

Code: [AUSKLAPPEN]

Graphics 640,480,32,0

SeedRnd MilliSecs()

Const x_tiles = 3
Const y_tiles = 3
Const zuf = 20

Dim x_dot (x_tiles)
Dim y_dot (y_tiles)

create_matrix()

;*** MAIN LOOP ***
SetBuffer BackBuffer()
While Not KeyDown (1)
  ClsColor 255,255,255 : Cls

  draw_matrix()

  Flip
Wend
End
;*** END OF MAIN LOOP ***

Function create_matrix()
  x_size = Int(GraphicsWidth() / x_tiles) ; average tile size x
  y_size = Int(GraphicsHeight() / y_tiles) ; average tile size y

  For y = 0 To y_tiles
    For x = 0 To x_tiles
      deg = Rand(0,359)

      x_dot(x) = x * x_size + zuf * Cos(deg)
      y_dot(y) = y * y_size + zuf * Sin(deg)

      If x = 0 Then x_dot(x) = 0
      If y = 0 Then y_dot(y) = 0

      If x = x_tiles Then x_dot(x) = GraphicsWidth()-1
      If y = y_tiles Then y_dot(y) = GraphicsHeight()-1

      Oval x_dot(x)-4, y_dot(y)-4,8,8,1
 
    Next
  Next
  WaitKey()   
End Function


Function draw_matrix()
  For y = 0 To y_tiles
    For x = 0 To x_tiles

    Color 255,0,0

    Oval x_dot(x)-4, y_dot(y)-4,8,8,1

    Next
  Next
End Function

Fobsi

BeitragDo, Jul 22, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
baut zuerst Y dann X
Code: [AUSKLAPPEN]
For y = 0 To y_tiles
    For x = 0 To x_tiles


genau umgekehrt mach einfach beide gleich.
Code: [AUSKLAPPEN]
For y = 0 To x_tiles
    For x = 0 To y_tiles


lg F.

gameworx

BeitragDo, Jul 22, 2010 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal danke für den Vorschlag.

Irgendwas mache ich wohl falsch. Ich habe mein Programm deinem Vorschlag entsprechend geändert:

- erst nur in der create_matrix Funktion
- dann in beiden Funktionen
- und zum Schluß nur in der draw_matrix Funktion

Der Fehler blieb bei allen 3 Versuchen bestehen, was eigentlich auch klar ist, da die Konstanten "x_tiles" und "y_tiles" beide mit "3" deklariert wurden.

Wenn ich die Konstante Zuf auf 0 setze, dann sind zwar alle Punkte identisch, haben aber nicht mehr die gewünschte Varianz.

Fobsi

BeitragDo, Jul 22, 2010 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
vieleicht hilft dier das weiter:

es liegt an

Code: [AUSKLAPPEN]
deg = Rand(0,359)


BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,32,0

SeedRnd MilliSecs()

Const x_tiles = 3
Const y_tiles = 3
Const zuf = 20

Dim x_dot (x_tiles)
Dim y_dot (y_tiles)

create_matrix()

;*** MAIN LOOP ***
SetBuffer BackBuffer()
While Not KeyDown (1)
ClsColor 255,255,255 : Cls

draw_matrix()

Flip
Wend
End
;*** END OF MAIN LOOP ***

Function create_matrix()
x_size = Int(GraphicsWidth() / x_tiles) ; average tile size x
y_size = Int(GraphicsHeight() / y_tiles) ; average tile size y

For y = 0 To y_tiles
For x = 0 To x_tiles
;deg = Rand(0,359)

x_dot(x) = x * x_size + zuf * Cos(deg)
y_dot(y) = y * y_size + zuf * Sin(deg)

If x = 0 Then x_dot(x) = 0
If y = 0 Then y_dot(y) = 0

;If x = x_tiles Then x_dot(x) = GraphicsWidth()-1
;If y = y_tiles Then y_dot(y) = GraphicsHeight()-1

Oval x_dot(x)-4, y_dot(y)-4,8,8,1

Next
Next
WaitKey()
End Function


Function draw_matrix()
For y = 0 To y_tiles
For x = 0 To x_tiles

Color 255,0,0

Oval x_dot(x)-4, y_dot(y)-4,8,8,1

Next
Next
End Function

gameworx

BeitragDo, Jul 22, 2010 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht ganz. Jetzt sind zwar die Punkte gleich, aber dein Vorschlag entspricht im Grunde meiner Anmerkung:

gameworx hat Folgendes geschrieben:
Wenn ich die Konstante Zuf auf 0 setze, dann sind zwar alle Punkte identisch, haben aber nicht mehr die gewünschte Varianz.


Das Ergebnis ist das Gleiche.

Mein Ziel ist aber folgendes:

user posted image

Die grauen Punkte haben normalerweise bedingt durch x_tiles/ y_tiles konstante Abstände. Ich möchte aber, dass alle Punkte, welche nicht am Bildschirmrand liegen (rote Punkte), innerhalb eines Radius (grüne Kreise) abweichen können bzw. die Punkte am Bildschirmrand, welche keine Eckpunkte sind ein wenig Spielraum in der horizontalen oder Vertikalen haben.

Xeres

Moderator

BeitragDo, Jul 22, 2010 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte dir sagen, dass das Problem ist, dass du y mehrfach andere Werte zuordnest, da Zufall+Schleife Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

gameworx

BeitragDo, Jul 22, 2010 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, ja, jaaaaaaaaaaa, da dämmert mir was. Shocked

Danke für den Tip.

gameworx

BeitragFr, Jul 23, 2010 8:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Problem gelöst. Ich habe die beiden Arrays x_tiles und y_tiles jetzt zweidimensional angelegt

Dim x_dot (x_tiles, y_tiles)
Dim y_dot (x_tiles, y_tiles)

Klappt jetzt wunderbar. Vielen Dank an Xeres.

Thread kann geschlossen werden.

Xeres

Moderator

BeitragFr, Jul 23, 2010 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm... wie meinen?
Du benutzt die doppelte Menge der Ursprünglichen Punkte - ist das Sinn der Sache? Ich hätte das 2D Array so erstellt, das alle Werte nur einmal eingetragen werden...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

gameworx

BeitragFr, Jul 23, 2010 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
War wohl mal wieder eine richte Kackn00b Aktion von mir, aber die Freude über das Ergebnis verdrängte die Zweifel am unsauberen Code...

Ich seh es mir wohl doch nochmal an. Laughing

In einem 2D Array alle Werte nur 1x eintragen. Du meinst, ich soll die x und y Bildschirmkoordinaten in der Variable dot(x,y) speichern? Als String z.B.?

EDIT:
Habe jetzt einen Array

Dim dot$ (x_tiles, y_tiles)

definiert, in dem ich die X- und Y-Koordinaten mit einem Komma getrennt als String speichere. War auch nicht wirklich schwer und funktionert.

das wurgel

BeitragDi, Jul 27, 2010 2:48
Antworten mit Zitat
Benutzer-Profile anzeigen
An deiner Stelle würde ich das mit den Strings lassen: Es ist langsamer und umständlich. Was Xeres meinte ist nur, dass du die eine mehrfache Anzahl an Punkten speicherst, als du vorher gespeicherst hast. Vorher hattest du jeweils 4 X-Koords und 4 Y. Das sind garade mal 4 Punkte. Das war, wie du selbst erkannt hast falsch, nun hast du 4*4 X-Koords und 4*4 Y. Also 16 Punkte, die zweidimensional verwaltet werden. Man kann sie natürlch auch wie Xeres sagte eindimensional speichern - das kommt aufs Selbe raus, nur ist es 2D einfacher, da du sie so über ihre Reihe und Spalte ansprechen kannst.
1 ist ungefähr 3

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group