Zahlenreihen drehen bzw. spiegeln

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jamagin

Betreff: Zahlenreihen drehen bzw. spiegeln

BeitragMo, Feb 18, 2013 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe eine 81stellige Zahl, welche in ein 9x9 Feld eingetragen wird. Nun möchte ich das ganze beispielsweise um 90° drehen oder spiegeln. Hat da schon wer Erfahrung damit? (Mathe)

Beispiel: Die erste Reihe hätte 9 0er, die 2te Reihe 9 1er und so weiter. Wenn nun gedreht wird, würde die erste Zahl in der ersten Reihe quasi die erste Zahl aus der 9ten Reihe, die erste Zahl aus der 8ten Reihe würde in das 2te Feld der ersten Reihe kommen und so on...! Da gibt es doch sicher ne Formel dafür?

Ich würde mich echt freuen auf positive Antworten! Es kann auch mit weniger als 81 Zahlen gerechnet werden der Einfachheit halber...!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Tennisball

BeitragMo, Feb 18, 2013 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Hab gerade mal etwas rumprobiert (allerdings mit BMax, und ohne wirklichen Plan, also eher Zufall, dass es funktioniert ;D).

Ich denke aber das Prinzip sollte trotzdem klar sein.

Initialisieren des Arrays:
BlitzMax: [AUSKLAPPEN]
Local numbers:Int[9,9]

Local x:Int
Local y:Int

For x = 0 To 8
For y = 0 To 8
numbers[x,y] = x*9+y
WriteStdout( numbers[x,y] + "~t" )
Next
WriteStdout("~n")
Next


Rotieren um 90° im Uhrzeigersinn:
BlitzMax: [AUSKLAPPEN]
Local oldnumbers:Int[9,9]
oldnumbers = copyarray( numbers )

For y = 0 To 8
For x = 0 To 8
numbers[x,y] = oldnumbers[8-x,y]
WriteStdout( numbers[x,y] + "~t" )
Next
WriteStdout("~n")
Next


Entgegen des Uhrzeigersinns:
BlitzBasic: [AUSKLAPPEN]
For y = 8 To 0 Step -1
For x = 8 To 0 Step -1
[...]


Die Funktion "CopyArray" o.ä. musst du dir auch noch schreiben, ich weiß nicht ob man in BB einem Array einfach ein anderes Array zuweisen kann. In BMax muss man das eh machen, weil Arrays Objekte sind, und würde man diese "gleichsetzen" so hätte man bloß zwei Referenzen auf ein und dasselbe Objekt... [/ot]

Ich hoffe das hat dir geholfen.

Gruß,
Tennisball

Addi

BeitragMo, Feb 18, 2013 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann es leider nicht testen, bin allerdings zuverlässig, dass es funktioniert:
BlitzBasic: [AUSKLAPPEN]
Function RotateDim90()
;Array zwischenspeichern
For i = 0 To 8
For j = 0 To 8
backUp(j, i) = yourDim(j, i)
Next
Next

;und jetzt um 90 Grad im UZS drehen
For i = 0 To 8
For j = 8 To 0 Step -1
yourDim(8-j, i) = backUp(i, j)
Next
Next
End Function

Edit:
Ja, es funktioniert!
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62
  • Zuletzt bearbeitet von Addi am Di, Feb 19, 2013 23:06, insgesamt 3-mal bearbeitet

FireballFlame

BeitragDi, Feb 19, 2013 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Tennisball hat Folgendes geschrieben:
Die Funktion "CopyArray" o.ä. musst du dir auch noch schreiben, ich weiß nicht ob man in BB einem Array einfach ein anderes Array zuweisen kann. In BMax muss man das eh machen, weil Arrays Objekte sind, und würde man diese "gleichsetzen" so hätte man bloß zwei Referenzen auf ein und dasselbe Objekt... [/ot]

Stimmt zwar, aber in BMax ist da keine Funktion nötig, kopieren geht auch so: BlitzMax: [AUSKLAPPEN]
Local newArray:Whatever[] = oldArray[..]
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

PhillipK

BeitragDi, Feb 19, 2013 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ihr schreibt lösungen, aber erklärt die wege :3

Ich hatte das problem immer, wenn ich ein tetris-just-for-fun geschrieben habe. Ich weigere mich strikt, einen 3d array für die blöcke zu nutzen - ich rotiere lieber die arrays.

Hab mich immer brav hingesetzt, 2 arrays in notepad dargestellt, der eine gedreht, der andere nicht und mir dann die indexverschiebung überlegt Smile

Nur soviel: Copy Array ist pflicht.
Ich meine, die rotation lässt sich einfach ausdrücken:

neu_x,y = verrechnung der koordinaten

MIT DEM UHRZEIGERSINN (+90°)
x,y = old_höhe - ( y +1 ), x

GEGEN DEN UHRZEIGERSINN (-90°)
x,y = y, old_breite - ( x + 1)

im pseudocode also etwa so:
BlitzMax: [AUSKLAPPEN]
Function RotatePlus90:Int[,]( source:Int[,], w:Int, h:Int)
Local dest:Int[,] = New Int[w,h]

For Local x:Int = 0 To w -1
For Local y:Int = 0 To h -1

dest[x,y] = source[h - (y +1), x]

Next
Next
Return dest
End Function

(achtung, blitzmax pseudocode, ungetestet, nur zur veranschaulichung)
(achtung 2: nur grob, im müden kopf, überlegt. Muss nicht richtig sein)

Am besten einfach mit zettel und stift hinsetzen, die berechnung herleiten und verstehen Smile Aber: Da selbst ich das schaff, kanns nicht so schwer sein, musst nur aufmerksam bleiben Smile

SpionAtom

BeitragDi, Feb 19, 2013 1:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man nicht weiß, wie man dreht, lässt man BB drehen Cool

Code: [AUSKLAPPEN]
Graphics 400, 400, 0, 2
Global MAX_X = 9, MAX_Y = 9
Dim feld(MAX_X - 1, MAX_Y - 1)
Global image = CreateImage(MAX_X, MAX_Y)
TFormFilter 0
AutoMidHandle 1

;Startsituation, Zahlenarray in Bild speichern
   For y = 0 To MAX_Y - 1
   For x = 0 To MAX_X - 1
      feld(x, y) = y * MAX_Y + x
   Next
   Next

;Array bevor Drehung anzeigen
   SetBuffer BackBuffer()
   Cls: displayFeld()
   Text 0, GraphicsHeight() - 16, "Taste für rotieren"
   Flip(): WaitKey

;Array drehen
   arrayZuBild
   RotateImage image, -90
   BildZuArray
   
;Array nach Drehung anzeigen
   Cls: displayFeld()
   Text 0, GraphicsHeight() - 16, "Taste für rotieren"
   Flip(): WaitKey
   End

Function displayFeld()
   g = 40
   LockBuffer ImageBuffer(image)
   For y = 0 To MAX_Y - 1
   For x = 0 To MAX_X - 1
      Text x * g, y * g, feld(x, y)
   Next
   Next
   UnlockBuffer ImageBuffer(image)
End Function

Function arrayZuBild()
   image = CreateImage(MAX_X, MAX_Y)
   LockBuffer ImageBuffer(image)
   For y = 0 To MAX_Y - 1
   For x = 0 To MAX_X - 1
      WritePixelFast x, y, feld(x, y), ImageBuffer(image)
   Next
   Next
   UnlockBuffer ImageBuffer(image)
End Function

Function BildZuArray()
   LockBuffer ImageBuffer(image)
   MAX_X = ImageWidth(image): MAX_Y = ImageHeight(image)
   For y = 0 To MAX_Y - 1
   For x = 0 To MAX_X - 1
      ;Rechne Bild in Zahlen um und schreib Ergebnis in Array
      feld(x, y) = ($FFFFFF And ReadPixelFast(x, y, ImageBuffer(image)) )
   Next
   Next
   UnlockBuffer ImageBuffer(image)
End Function


Ist natürlich nur ein Spaßprogramm, aber mit dem Rotate-Befehl lässt sich wunderbar Tetris schreiben: https://www.blitzforum.de/foru...618#407618
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group