Processing random getal genereren

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Ik ben bezig om een programma te schrijven met processing. Aan dit programma wil ik graag een random titel toevoegen die om de 30 sec of elke keer dat het programma opnieuw gestart wordt verandert.

Ik heb hier de draw met 2 functies. De functie drawData() wordt constant getekend en daardoor helpt een delay toevoegen aan de randomtitel (natuurlijk) niet.

code:
1
2
3
4
5
6
7
8
9
10
11
12
void draw() {
    background(245,243,237);

    drawData();
    randomFunction();
}

void randomFunction(){
    String[] words = {"Dit is titel 1", "Dit is titel 2" };
    int index = int(random(words.length));
    text(words[index],20,20);
}

Het probleem is dus: met deze code wordt de titel constant vernieuwd, en een delay toevoegen werkt niet. Is er iemand die me op weg kan helpen?

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
In pseudo-code:
code:
1
2
3
4
function draw() {
  if (current_time % 30 == 0)
    call randomFunction();
}

Aan jou om dat om te zetten naar Processing. (Waarbij % de modulo operator is en current_time de tijd in seconden geeft (zoals een UNIX timestamp of gewoon second() ofzo).

[ Voor 35% gewijzigd door RobIII op 03-11-2016 18:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Oke precies, ik snap de gedachtegang en heb het toegepast in de code.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int s = second();

void draw() {
    drawData();
    if (s  % 30 == 0){
      randomFunction();
    }
}

void randomFunction(){
    String[] words = {"Dits is titel 1", "Dit is titel 2" };
    int index = int(random(words.length));
    text(words[index],20,20);

}


Nu wordt telkens als de klok op mijn pc bij 0 seconde is de functie aangeroepen, echter wordt in die 0e seconde 100x de titel aangemaakt. Zodra de 0e seconde voorbij is zijn de titels weer weg.

Wat evt een oplossing zou zijn (denk ik) is om het genereren van de titel in het if statement in de draw te zetten en vervolgens het 'tekenen' van de titel in de randomFunction

[ Voor 13% gewijzigd door Ambianz op 03-11-2016 19:26 ]


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nou; doe eens gek en probeer zelf eens een oplossing te bedenken? (Want dit zag ik al van mijlenver aankomen).

Hint in de juiste richting: onthou wanneer je voor het laatst de titel gewijzigd hebt? Dan verdandert je if-conditie naar iets als "wanneer huidig - laatst gewijzigd >= 30..." et voila.

[ Voor 19% gewijzigd door RobIII op 03-11-2016 19:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Het punt waar ik een beetje tegen aanloop is dat er telkens een nieuwe background getekend wordt. Die background wordt dus over elke huidige titel heengezet.

edit: misschien een beetje simpel maar een rectangle tekenen in dezelfde kleur als de bg met het hoekje van de titel eruit gesneden zou dan de oplossing kunnen zijn,

[ Voor 34% gewijzigd door Ambianz op 03-11-2016 20:30 ]


Acties:
  • 0 Henk 'm!

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 10-10 12:24

Emiel1984

Made in NL

Ambianz schreef op donderdag 03 november 2016 @ 20:22:
Het punt waar ik een beetje tegen aanloop is dat er telkens een nieuwe background getekend wordt. Die background wordt dus over elke huidige titel heengezet.

edit: misschien een beetje simpel maar een rectangle tekenen in dezelfde kleur als de bg met het hoekje van de titel eruit gesneden zou dan de oplossing kunnen zijn,
Even aangenomen dat drawData() je achtergrond overschrijft. Kan je deze niet binnen de if statement aanroepen waarin je ook daadwerkelijk een andere titel krijgt ?

[LTS][MTS][HTS]


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ambianz schreef op donderdag 03 november 2016 @ 20:22:

edit: misschien een beetje simpel maar een rectangle tekenen in dezelfde kleur als de bg met het hoekje van de titel eruit gesneden zou dan de oplossing kunnen zijn,
Veel makkelijker: je onthoudt gewoon de laatst gegenereerde/gekozen titel en tekent die elk grame ook ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 10-10 12:24

Emiel1984

Made in NL

RobIII schreef op donderdag 03 november 2016 @ 20:43:
[...]

Veel makkelijker: je onthoudt gewoon de laatst gegenereerde/gekozen titel en tekent die elk grame ook ;)
Maar waarom zou je de de background willen verversen als er geen enkele verandering is ? Of mis ik hier iets ?

[LTS][MTS][HTS]


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Er is wel verandering, ik roep data op uit een csv en die wordt elk frame gegenereerd. Alleen heb ik die niet in het topic gezet.

Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
RobIII schreef op donderdag 03 november 2016 @ 20:43:
[...]

Veel makkelijker: je onthoudt gewoon de laatst gegenereerde/gekozen titel en tekent die elk grame ook ;)
De laatste keer dat de titel gegenereerd wordt is dus dit stukje:
String[] words = {"zin 1", "zin 1" };
int index = int(random(words.length));
text(words[index],20,20);

Echter is de string niet globaal dus die kan ik alleen in deze functie gebruiken toch? Hoe zou ik deze dan kunnen 'onthouden' en elk frame tekenen.

[ Voor 5% gewijzigd door Ambianz op 03-11-2016 21:07 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ambianz schreef op donderdag 03 november 2016 @ 21:07:
[...]


De laatste keer dat de titel gegenereerd wordt is dus dit stukje:
String[] words = {"zin 1", "zin 1" };
int index = int(random(words.length));
text(words[index],20,20);

Echter is de string niet globaal dus die kan ik alleen in deze functie gebruiken toch? Hoe zou ik deze dan kunnen 'onthouden' en elk frame tekenen.
Sorry, maar kom op. We gaan hier niet je handje houden. What if... je de tekst opslaat in een globale var ipv tekent? En dan elk frame de inhoud van die globale var tekent?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Pff excuus, je hebt gelijk maar zit er al een aantal dagen zo diep in dat ik dit soort dingen over het hoofd zie. Ben ook pas nieuw met programmeren maar dat is in deze natuurlijk geen excuus.

Acties:
  • 0 Henk 'm!

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 10-10 12:24

Emiel1984

Made in NL

Je kan dit op verschillende manieren aanpakken. Ik ben van mening dat je met de input van RobIII de oplossing al zou moeten hebben. Het is enkel aan jouw om dit op de juiste manier om te zetten in code.

Om je nog een laatste maar flinke duw te geven in de juiste richting. Denk in blokjes zoals:
- Scherm - Titel update
- Scherm - Achtergrond update
- Scherm - Data update
- Scherm update

[ Voor 3% gewijzigd door Emiel1984 op 03-11-2016 21:31 ]

[LTS][MTS][HTS]


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Het is gelukt, bedankt voor jullie hulp. Wat het moeilijk maakte was dat ik voor mezelf al een stap verder was, namelijk een plaatje genereren ipv een titel. En het was nog niet helemaal duidelijk hoe ik hier een globale variabele van kon maken om later weer op te roepen.

Uiteindelijk zo gedaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PImage titel;
PImage titel1;

void setup() {
   titel = loadImage("titel0.png");
}

void mousePressed() {
 for (int i = 0; i < 1; i++) {
   int titelnummer = (int) random(2);
   println(titelnummer);
   titel = loadImage("titel"+titelnummer+".png");
 }

void drawData(){
  image(titel,0,20, width/4, height/8);
}


edit: heb er een mousepressed van gemaakt omdat dit beter in het concept past, maar idee is hetzelfde

[ Voor 7% gewijzigd door Ambianz op 03-11-2016 22:33 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ambianz schreef op donderdag 03 november 2016 @ 22:25:
Uiteindelijk zo gedaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PImage titel;
PImage titel1;

void setup() {
   titel = loadImage("titel0.png");
}

void mousePressed() {
 for (int i = 0; i < 1; i++) {
   int titelnummer = (int) random(2);
   println(titelnummer);
   titel = loadImage("titel"+titelnummer+".png");
 }

void drawData(){
  image(titel,0,20, width/4, height/8);
}
Staat die for (int i = 0; i < 1; i++) { er echt en geeft dit geen parse error ?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 07-10 20:21
Die loopt gaat eigenlijk van 0 tot 6. Heb er 6 images staan.
Pagina: 1