PDA

Volledige versie bekijken : transformatie van arrays


davyvh
%Europe/Berlin %879 %2005, 21:05
Hoy,
Ik ben aan het experimenteren met het transformeren van 4x4 Arrays.
De bedoeling is om een array "-90° te kantelen" om het zo maar te zeggen.
rij 2 kolom 1 => rij 1 kolom 3
rij 2 kolom 2 => rij 2 kolom 3
rij 2 kolom 3 => rij 3 kolom 3
...

Hierin heb ik devolgende logica ontdekt:
a[y][x] => aTransform[j][4-i] //voor 4x4 arrays

Ik wou dit in scriptvorm schrijven en kwam tot hetvolgende uit:
test = new Array();
test = [[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 0, 0]];

testT = new Array();
for(y=0; y<4; y++)
{
for(x=0; x<4; x++)
{
testT[y][x] = test[x][4-y];
}
}
trace(testT);
Dit script werkt niet. Al vind ik het logisch opgebouwd.
Ziet iemand de correcte logica hierin?

Groeten,
Davy

Roenes
%Europe/Berlin %945 %2005, 22:40
Volgens mij had mediamonkey daar ooit een scriptje voor geplaatst in het ASSC. Het kan zijn dat het op het oude systeem was, dat weet ik niet meer. Wellicht hem even erover contacten, want het lijkt simpel maar ik kan me herinneren dat de oplossing wat moeilijker lag als verwacht :)

Dauntless
%Europe/Berlin %980 %2005, 23:31
Ik kan mij ook herinneren dat iemand zo'n scriptje geschreven had.... Ik kan me alleen niet meer herinneren wie ...

SaphuA
%Europe/Berlin %987 %2005, 23:42
Behalve dat het 3-y moet zijn moet je theorie verder kloppen :)

Edit: Even een voorbeeldje
function output(a) {
for (var j = 0; j<4; j++) {
trace(a[j]);
}
}
function rotate(a) {
var b = new Array();
for (var j = 0; j<4; j++) {
b[j] = new Array();
for (var i = 0; i<4; i++) {
b[j][i] = a[i][3-j];
}
}
return b;
}
var myArray = [
[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 0, 0]];
output(myArray);
myArray = rotate(myArray);
output(myArray);

davyvh
%Europe/Berlin %768 %2005, 18:27
Erg badankt SaphuA
Ik snap wel niet waar 3-j vandaan komt, als je verschillende voorbeeldjes opschrijft en vergelijkt kom je 4-j uit dacht ik... maar swat.

davyvh
%Europe/Berlin %905 %2005, 21:43
Ok,
Kheb nog een volgende stap gevonden :D
Nu wil ik niet alleen vierkante 2D arrays kantelen, maar gelijk welke 2D array.
Ik heb een hele hoop verschillende soorten arrays geschreven en dan een random scriptje dat dus random een array kiest die gekanteld moet worden.
Het lukt vrij goed.
Enkel moet ik van het aantal rijen het aantal kolommen maken en omgekeerd. Een 2x3 array wordt dus een 3x2 array. Bij onderstaand script blijft een 2x3 een 2x3... Spijtig genoeg zie ik het maar niet in hoe deze logica in elkaar zit... Wie kan me helpen?

function rotateLeft(a)
{
var b = new Array();
for (var j = 0; j<myArray.length; j++)
{
b[j] = new Array();
for (var i = 0; i<myArray[j].length; i++)
{
b[j][i] = a[i][3-j];
}
}
return b;
}

Alvast erg bedankt,
Davy

SaphuA
%Europe/Berlin %935 %2005, 22:27
Erg badankt SaphuA
Ik snap wel niet waar 3-j vandaan komt, als je verschillende voorbeeldjes opschrijft en vergelijkt kom je 4-j uit dacht ik... maar swat.
Omdat je array index bij 3 begint en niet bij 4. En aangezien je met de for-loop de waardes 0-3 krijgt, zou je met 4-j één index te hoog uitkomen.

Verder, over je code. We hebben een functie waarin we de array als parameter meegeven, maar in de functie zelf gebruik je niet de parameter maar de array zelf. Dan heeft deze ook niet veel nut :) Verder moet je natuurlijk de 3-j aanpassen, omdat niet elke array nu een lengte van 4 heeft.

Ik heb nu dit in elkaar gezet, dit zou met alles moeten werken:
function output(a) {
for (var j = 0; j<myArray.length; j++) {
trace(a[j]);
}
trace("");
}
function rotateLeft(a) {
var b = new Array();
for (var j = 0; j<a[0].length; j++) {
b[j] = new Array();
for (var i = 0; i<a.length; i++) {
b[j][i] = a[i][(a[0].length-1)-j];
}
}
return b;
}
var myArray = [
[1, 1, 1],
[0, 1, 0],
[0, 1, 0],
[0, 1, 0]];
output(myArray);
myArray = rotateLeft(myArray);
output(myArray);

davyvh
%Europe/Berlin %960 %2005, 23:03
Ow... dit is dus m'n grote probleem... Ik zoek de fouten veel te ver en verlies zeer veel tijd aan kleine foutjes die niet mogen gebeuren.

Weer heel erg bedankt!
Groeten,
Davy