AKTUALIZACJA PONIŻEJwykonać javascsript do pętli na przemian do przodu i do tyłu
Co usiłuję zrobić jest iterację tablicy w kawałkach, na przemian kierunek iteracji od kawałka do kawałka. Zmieszany? Ja też. Na przykład, jeśli chcę zapętlić się przez tablicę z 25 elementami, ale chcę to zrobić w tej kolejności: 0, 1, 2, 3, 4, 9, 8, 7, 6, 5, 10 , 11, 12, 13, 14, 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, jaki byłby najskuteczniejszy sposób robienia tego? Szukam czegoś skalowalnego, ponieważ macierz, z którą teraz pracuję, to w rzeczywistości 225 elementów i chcę ją przemierzyć w 15 elementach, ale to może się w pewnym momencie zmienić. Do tej pory jedyną metodą, którą odkryłem, która faktycznie działa, jest sztywne połączenie kolejności iteracji w drugą macierz, a następnie iterowanie w normalny sposób, aby uzyskać indeksy dla oryginalnej tablicy. Ale to jest do bani. Każda pomoc będzie bardzo ceniona.
@Bergi poprosił o kod przykładowy. Proszę, nie bij mnie za bardzo. Nadal jestem noobem:
function zeroPadNumber(theNumber, thePadding) {
var thePaddedNumber = thePadding.substring(0, (thePadding.length - theNumber.length)) + theNumber;
return thePaddedNumber;
}
var thisTile = 225;
var waveLoop = 15;
function mosaicWave() {
var theStartNum = thisTile;
for (w = 0; w < 15; w++) {
var theNum = theStartNum - w;
var theNumString = String(theNum);
var thePaddedNum = zeroPadNumber(theNumString, "000");
var theImgName = "sm_" + thePaddedNum;
var theNewSrc = theImgFolder + theImgName + "bg.gif";
document.images[theImgName].src = theNewSrc;
thisTile = theNum - 1;
if (waveLoop < 15) {
var prevStartTile = theStartNum + 15;
var thePrevNum = prevStartTile - w;
var thePrevNumString = String(thePrevNum);
var thePrevPaddedNum = zeroPadNumber(thePrevNumString, "000");
var thePrevName = "sm_" + thePrevPaddedNum;
var thePrevSrc = theImgFolder + thePrevName + ".gif";
document.images[thePrevName].src = thePrevSrc;
}
}
if (waveLoop == 1) {
var lastWave = function() {
var theStartNum = 15;
for (c = 0; c < 15; c++) {
var theNum = theStartNum - c;
var theNumString = String(theNum);
var thePaddedNum = zeroPadNumber(theNumString, "000");
var theImgName = "sm_" + thePaddedNum;
var theNewSrc = theImgFolder + theImgName + ".gif";
document.images[theImgName].src = theNewSrc;
}
}
setTimeout(lastWave, 100);
waveLoop = 15;
thisTile = 225;
} else {
waveLoop--;
setTimeout(mosaicWave, 100);
}
}
Ten fragment kodu przedstawia inną animację. Zaczyna się w prawym dolnym rogu matrycy i "włącza" 15 płytek w dolnym rzędzie. następnie przesuwa się w górę rzędu, włącza płytki w tym rzędzie i wyłącza płytki w poprzednim rzędzie. I tak dalej, aż górny rząd zostanie włączony, a następnie wyłączony. niezbyt daleko od efektu góry w dół serpentyn, który staram się osiągnąć w nowej funkcji. Kolejność odwrotu w każdym rzędzie była dla mnie najważniejsza. W związku z tym wszelkie sugestie dotyczące optymalizacji powyższego kodu również będą mile widziane.
UPDATE 1:
Dla mnie to wydaje się, że powinna działać, ale tak nie jest. Czy ktoś może zauważyć problem?
var loopRange = 225;
var blockRange = 15;
var theDirection = 1;
var weaveLoop = 0;
function mosaicWeave() {
var curObj, curSrc, lastObj, lastSrc;
var toggleLeadTile = function() {
alert(curSrc);
curObj.src = curSrc;
};
var toggleLastTile = function() {
lastObj.src = lastSrc;
};
while (weaveLoop < loopRange) {
imgNum = weaveLoop + 1;
imgName = "sm_" + zeroPadNumber(String(imgNum), "000");
if (imgNum < 15) {
//handle first row
curObj = document.images[imgName];
curSrc = theImgFolder + imgName + "bg.gif";
window.setTimeout(toggleLeadTile, 100);
} else if (imgNum == 225) {
//handle last row
curObj = document.images[imgName].src;
curSrc = theImgFolder + imgName + "bg.gif";
window.setTimeout(toggleLeadTile, 100);
for (i = 211; i < 226; i++) {
lastImgName = "sm_" + ((weaveLoop + 1) - 15);
lastObj = document.images[lastImgName];
lastSrc = theImgFolder + lastImgName + ".gif";
window.setTimeout(toggleLastTile, 100);
}
} else {
//handle middle rows
lastImgName = "sm_" + ((weaveLoop + 1) - 15);
curObj = document.images[imgName];
curSrc = theImgFolder + imgName + "bg.gif";
lastObj = document.images[lastImgName];
lastSrc = theImgFolder + lastImgName + ".gif";
window.setTimeout(toggleLeadTile, 100);
window.setTimeout(toggleLastTile, 100);
}
if (weaveLoop % blockRange == (theDirection == -1 ? 0 : blockRange - 1)) {
theDirection *= -1;
weaveLoop += blockRange;
} else {
weaveLoop += theDirection;
}
}
}
UPDATE 2:
Dzięki za wkład każdego z nas. Działa to:
var resetLoop = 1;
var weaveArray = new Array(225);
var weaveRange = 15, weaveDirection = 1, weaveIndex = 0, wInitLoop = 0;
function mosaicWeave() {
while (weaveIndex < 225) {
weaveArray[wInitLoop] = weaveIndex + 1;
if (weaveIndex % weaveRange == (weaveDirection == -1 ? 0 : weaveRange - 1)) {
weaveDirection *= -1;
weaveIndex += weaveRange;
} else {
weaveIndex += weaveDirection;
}
wInitLoop++;
}
mWeaveOn();
}
function mWeaveOff() {
var theNumString = String(weaveArray[resetLoop - 16]);
var theImgName = "sm_" + zeroPadNumber(theNumString, "000");
document.images[theImgName].src = "images/" + theImgName + ".gif";
mosaicArray[resetLoop - 1] = 0;
resetLoop++;
if (resetLoop < 226) {
setTimeout(mWeaveOn, 25);
} else if (resetLoop > 225 && resetLoop <= 240) {
setTimeout(mWeaveOff, 25);
} else {
resetLoop = 1;
}
}
function mWeaveOn() {
var theNumString = String(weaveArray[resetLoop - 1]);
var theImgName = "sm_" + zeroPadNumber(theNumString, "000");
document.images[theImgName].src = "images/" + theImgName + "bg.gif";
mosaicArray[resetLoop - 1] = 1;
if (resetLoop < 16) {
resetLoop++;
setTimeout(mWeaveOn, 25);
} else {
setTimeout(mWeaveOff, 25);
}
}
Czy ktoś ma opinię na temat, czy jest bardziej efektywny sposób to zrobić? Albo dowiedzieć się, jak to może wpłynąć na różne platformy/przeglądarki lub w innych okolicznościach? Dzięki jeszcze raz.
można dodać kontekst do postu? Jaki jest pomysł? –
Zrobiłem pętlę z jednym kontuarem. W odpowiednich miejscach (4, 5, 14, 15, ...) zmienia się kierunek (inkrementacja/dekrementacja), a licznik przeskakuje jeden fragment (4 → 9, 5 → 10, 14 → 19, ...). – Bergi
Mam matrycę małe obrazy w siatce 15 x 15. Każdy obraz ma dwie wersje (stan włączony i wyłączony). Chcę zrobić zwykłą zamianę obrazów na serpentynę (wiersz 1: od lewej do prawej, wiersz 2: od prawej do lewej, wiersz 3: od lewej do prawej itd.). Dodatkowym zmarszczeniem będzie to, że po tym, jak pierwszy rząd obrazów zostanie "włączony", zostaną one "wyłączone" w tej samej sekwencji, podczas gdy obrazy w rzędzie 2 zostaną "włączone". to jest strona w obecnej postaci: [uglydigits.com] (http://www.uglydigits.com/index.html) Efekt serpentynowy, który próbuję osiągnąć, będzie dotyczył funkcji resetowania. –