Zahlenreihen drehen bzw. spiegeln
Übersicht

![]() |
JamaginBetreff: Zahlenreihen drehen bzw. spiegeln |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] Rotieren um 90° im Uhrzeigersinn: BlitzMax: [AUSKLAPPEN] Local oldnumbers:Int[9,9] Entgegen des Uhrzeigersinns: BlitzBasic: [AUSKLAPPEN] For y = 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann es leider nicht testen, bin allerdings zuverlässig, dass es funktioniert:
BlitzBasic: [AUSKLAPPEN] Function RotateDim90() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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) (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 ![]() ![]() |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn man nicht weiß, wie man dreht, lässt man BB drehen ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group