Hoi,
Ik ben bezig met een fotogallery van een Flash-website en het lukt me niet een simpel probleem op te lossen. De situatie is als volgt.
De site haalt een lijst (foto)bestandsnamen uit een xml-bestand en plaats deze op volgorde zoals gelezen in een array allImages. Deze array heeft lengte allImages_amount en loopt van 0 tot allImages_amount-1
Ik heb een functie createImageList gemaakt die een array imageList maakt met alle fotobestandsnamen erin. Deze lijst moet voldoen aan de volgende criteria:
- de eerste n plaatsen (n is opgeslagen in de variable photoAmount) worden bezet door de laatste n foto's uit de bestandsnamenarray;
- de resterende plekken, zijnde allImages_amount - photoAmount, worden ingevuld met de resterende foto's, waarbij deze willekeurig gekozen moet zijn;
- iedere foto mag slechts eenmaal worden gekozen.
De onderstaande functie doet het volgende:
- de eerste n(=photoAmount) plekken toewijzen aan de laatste n(=photoAmount) foto's uit het xml-bestand;
- random een getal kiezen tussen 0 en allImages_amount - photoAmount (want dat is het aantal resterende foto's);
- kijken of de bestandsnaam die op de random gekozen plek staat al is opgeslagen op een eerdere positie in de uiteindelijke imageList (indien ja: opnieuw; indien nee: foto toewijzen).
De eerste twee stappen gaan goed, alleen daarna komt de functie maar tot allImages_amount - 1, c.q. vindt geen vrije foto meer en komt alsnog in een loop. Met andere woorden, ondanks dat er allImages_amount foto's zijn (deze waarde wordt bepaald uit het xml-bestand en is correct), kan het ding maar allImages_amount-1 foto's toewijzen en vindt voor de laatste plek geen vrije foto meer.
Let op: de automatisch gegenereerde array allImages loopt van 0 tot allImages_amount - 1. De te vullen array imageList loopt van 1 tot allImages_amount. Ergens moet ik die positie 1 opschuiven vanwege andere output, en zo lang het maar consequent gebeurt moet dat hier kunnen.
Stel er zijn in totaal 50 foto's en photoAmount is 20, dat betekent dus dat uit de allImags-array eerst de laatste twintig foto's gekozen moeten worden (i=49..30) en vervolgens random de foto's 29.. 0.
Dus (imageList | allImages) = (1|49), (2|48), (3|47), ..., (20|30), (21|random-uit-30), (22|random-uit-29), ..., (50|random-uit-1).
Dit kan niet moeilijk zijn, maar ik zie het toch niet. Iemand een idee wat hier fout gaat?
Ik ben bezig met een fotogallery van een Flash-website en het lukt me niet een simpel probleem op te lossen. De situatie is als volgt.
De site haalt een lijst (foto)bestandsnamen uit een xml-bestand en plaats deze op volgorde zoals gelezen in een array allImages. Deze array heeft lengte allImages_amount en loopt van 0 tot allImages_amount-1
Ik heb een functie createImageList gemaakt die een array imageList maakt met alle fotobestandsnamen erin. Deze lijst moet voldoen aan de volgende criteria:
- de eerste n plaatsen (n is opgeslagen in de variable photoAmount) worden bezet door de laatste n foto's uit de bestandsnamenarray;
- de resterende plekken, zijnde allImages_amount - photoAmount, worden ingevuld met de resterende foto's, waarbij deze willekeurig gekozen moet zijn;
- iedere foto mag slechts eenmaal worden gekozen.
De onderstaande functie doet het volgende:
- de eerste n(=photoAmount) plekken toewijzen aan de laatste n(=photoAmount) foto's uit het xml-bestand;
- random een getal kiezen tussen 0 en allImages_amount - photoAmount (want dat is het aantal resterende foto's);
- kijken of de bestandsnaam die op de random gekozen plek staat al is opgeslagen op een eerdere positie in de uiteindelijke imageList (indien ja: opnieuw; indien nee: foto toewijzen).
De eerste twee stappen gaan goed, alleen daarna komt de functie maar tot allImages_amount - 1, c.q. vindt geen vrije foto meer en komt alsnog in een loop. Met andere woorden, ondanks dat er allImages_amount foto's zijn (deze waarde wordt bepaald uit het xml-bestand en is correct), kan het ding maar allImages_amount-1 foto's toewijzen en vindt voor de laatste plek geen vrije foto meer.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| var i; // Assign latest photos for (i=1;i<=photoAmount;i++) { imageList[i] = all_images[allImages_amount-i].@file; } // Assign other photos randomly for (i=photoAmount+1;i<=allImages_amount;i++) { var pickedImage = Math.floor((allImages_amount-photoAmount)*Math.random()); // Check whether photo has been displayed before in storage list var dubbelCheckValue = dubbelCheck(pickedImage); // Assign photo or new attempt if (dubbelCheckValue == false) { imageList[i] = all_images[pickedImage].@file; } else { i--; } } // Check for already used photo function dubbelCheck(pickedImage):Boolean { var pickedImage; var dubbelCheckValue = false; for (var j=1;j<=i-1;j++) // controleren tot vorige positie { if (all_images[pickedImage].@file == imageList[j]) { dubbelCheckValue = true; } } return dubbelCheckValue; } |
Let op: de automatisch gegenereerde array allImages loopt van 0 tot allImages_amount - 1. De te vullen array imageList loopt van 1 tot allImages_amount. Ergens moet ik die positie 1 opschuiven vanwege andere output, en zo lang het maar consequent gebeurt moet dat hier kunnen.
Stel er zijn in totaal 50 foto's en photoAmount is 20, dat betekent dus dat uit de allImags-array eerst de laatste twintig foto's gekozen moeten worden (i=49..30) en vervolgens random de foto's 29.. 0.
Dus (imageList | allImages) = (1|49), (2|48), (3|47), ..., (20|30), (21|random-uit-30), (22|random-uit-29), ..., (50|random-uit-1).
Dit kan niet moeilijk zijn, maar ik zie het toch niet. Iemand een idee wat hier fout gaat?
[ Voor 5% gewijzigd door Luke! op 08-03-2009 02:36 ]