Bonjour,
N'ayant pas eu de réponses lors d'un précédent post j'ai changé l'idée de mon rendu en espérant que cela soit plus simple ^^.
Voila donc l'idée c'est que j'ai mon visuel (voir plus bas le code) et je souhaiterais faire apparaitre des mots sur les points. En tout il y aurai 10 mots qui se place aléatoirement sur 10 des points présents sur le visuel.
Comment puis-je m'y prendre, déjà j'ai réussi à placer les mots sur tout les points il suffirait donc de limiter le nombre de mots mais je ne sait pas comment faire j'ai laissé mon test en commentaire dans le code.
Merci pour votre aide
voici le code :
Particle[] pArray;
void setup()
{
size( 1000, 500,P3D);
smooth(4);
strokeWeight(1);
stroke(0, 2, 120);
pArray = new Particle[1000];
for( int i=0; i<pArray.length; i++ )
{
pArray[i] = new Particle( random( width ), random( height ), 0 );
pArray[i].vel.set( 0, 0, 0);
}
}
void draw()
{
background(255);
fill(0);
stroke(0, 20);
strokeWeight(1);
for ( int i=0;i<pArray.length;i++ )
{
pArray[i].update();
}
//adding in network
for (int i = 0; i < pArray.length-1; i++) {
for (int j = i; j < pArray.length; j++) {
if (dist(pArray[j].pos.x, pArray[j].pos.y, pArray[i].pos.x, pArray[i].pos.y) < 33) {
line(pArray[j].pos.x, pArray[j].pos.y, pArray[i].pos.x, pArray[i].pos.y);
}
}
}
for ( int i=0;i<pArray.length;i++ )
{
pArray[i].draw();
}
}
void mouseReleased()
{
println( "Mouse released!" );
for ( int i=0;i<pArray.length;i++ )
{
pArray[i].attract = !pArray[i].attract;
}
}
class Particle
{
PVector pos;
PVector vel;
PVector acc;
boolean attract;
Particle( float x, float y, float z )
{
pos = new PVector(x, y, z);
vel = new PVector();
acc = new PVector();
attract = true;
}
void update()
{
mouseAttract();
vel.add( acc );
pos.add( vel );
vel.mult( 0.80f );
bounce();
acc.set( 0, 0, 0 );
}
//particules creation
void draw()
{
colorMode( RGB, 255, 255, 255 );
ellipse( pos.x, pos.y, 5, 5 );
point(pos.x, pos.y);
smooth(4);
//text("1mot"+ "2mot" + "3mot" + "4mot" + "5mot" + "6mot" + "7mot" + "8mot" + "9mot" + "10mot", pos.x, pos.y);
}
void bounce()
{
if ( pos.x < 0 || pos.x > width )
{
vel.x *= -1.0f;
}
if ( pos.y < 0 || pos.y > height )
{
vel.y *= -1.0f;
}
}
void mouseAttract()
{
float magnetism;
if ( attract == true )
{
magnetism = -5.0f;
}
else
{
magnetism = 5.0f;
}
PVector mouse = new PVector( mouseX, mouseY );
mouse.sub( pos );
float magnitude = mouse.mag();
acc.set( mouse );
acc.mult( magnetism / (magnitude * magnitude) );
}
}
Emilie
Hors ligne
Chouette petit code.
Voici quelques pistes :
tu crée une fonction drawTex() avec la ligne txt(...
que tu appelle dans ton draw() 10x
Le tout est de voir comment tu veux faire la partie aléatoire.
Comment les mots changent-ils et à quelle vitesse ?
Rien de très compliqué
Hors ligne
Bonsoir,
Il suffit de rajouter un champ mot initialisé dans le constructeur comme une chaîne vide. Dans le setup() {
tu réalises dix tirages aléatoires de l'indice et tu changes la valeur du champ.
Dans l'affichage de ta particule, si le champ n'est pas vide, tu l'affiches.
Particle[] pArray; void setup() { size(1000, 500, P3D); smooth(4); strokeWeight(1); stroke(0, 2, 120); pArray = new Particle[1000]; for (int i = 0; i < pArray.length; i++ ) { pArray[i] = new Particle(random( width ), random( height ), 0 ); pArray[i].vel.set( 0, 0, 0); } for (int i = 0; i < 10; i++) { pArray[int(random(1000))].mot = "mot" + i; } } void draw() { background(255); fill(0); stroke(0, 20); strokeWeight(1); for (int i = 0; i < pArray.length; i++ ) { pArray[i].update(); } //adding in network for (int i = 0; i < pArray.length-1; i++) { for (int j = i; j < pArray.length; j++) { if (dist(pArray[j].pos.x, pArray[j].pos.y, pArray[i].pos.x, pArray[i].pos.y) < 33) { line(pArray[j].pos.x, pArray[j].pos.y, pArray[i].pos.x, pArray[i].pos.y); } } } for (int i = 0; i < pArray.length; i++ ) { pArray[i].draw(); } } void mouseReleased() { println( "Mouse released!" ); for (int i = 0; i < pArray.length; i++ ) { pArray[i].attract = !pArray[i].attract; } } class Particle { PVector pos; PVector vel; PVector acc; boolean attract; String mot; Particle( float x, float y, float z ) { pos = new PVector(x, y, z); vel = new PVector(); acc = new PVector(); attract = true; mot = ""; } void update() { mouseAttract(); vel.add( acc ); pos.add( vel ); vel.mult( 0.80f ); bounce(); acc.set( 0, 0, 0 ); } //particules creation void draw() { colorMode( RGB, 255, 255, 255 ); ellipse( pos.x, pos.y, 5, 5 ); point(pos.x, pos.y); smooth(4); if (mot != "") { text(mot, pos.x, pos.y); } } void bounce() { if (pos.x < 0 || pos.x > width ) { vel.x *= -1.0f; } if (pos.y < 0 || pos.y > height ) { vel.y *= -1.0f; } } void mouseAttract() { float magnetism; if ( attract == true ) { magnetism = -5.0f; } else { magnetism = 5.0f; } PVector mouse = new PVector( mouseX, mouseY ); mouse.sub( pos ); float magnitude = mouse.mag(); acc.set( mouse ); acc.mult( magnetism / (magnitude * magnitude) ); } }
Hors ligne
salut, merci pour les réponses j'ai trouvé en fait j'ai utilisé les string pour lister mes mots et ensuite les injecter en aléatoire sur certains des points aléatoire par contre du coup je suis coincé sur un autre point c'est que je souhaiterai mettre une forme au milieu et que mes lignes rebondissent dessus ( qu'elles ne passent pas dessous )
merci pour votre aide en tout cas
Hors ligne
Un moyen simple et d'ajouter des conditions à ta fonction bounce().
Comme si les objets arrivaient sur le bord.
Il faut voir maintenant si ta forme est simple du genre carré.
Que veux-tu mettre au centre ?
Hors ligne
matthieu a écrit:
Un moyen simple et d'ajouter des conditions à ta fonction bounce().
Comme si les objets arrivaient sur le bord.
Il faut voir maintenant si ta forme est simple du genre carré.
Que veux-tu mettre au centre ?
c'est ce que je me suis dis, ca serait une ellipse à mettre au centre mais deja pour le test un carré serait plus simple à définir je pense ^^
Hors ligne
en fait le soucis que j'ai c'est que oui je peux les contenir dans un carré mais le contraire me parait compliqué il faudrait qu'ici : if ( pos.y < 250 || pos.y > 500 ) pour les tailles au lieu de mettre juste 250 je puisse en mettre 2 du genre de 0 à 250 et pour l'autre de 500 à 1000 ce qui laisserait un trou de 250 au milieu mais je sait pas si c'est possible d'écrire ca :s enfin je voit pas comment ou alors ma réflexion n'est pas bonne et il y a un autre moyen
Hors ligne
Essaye avec ça alors https://processing.org/reference/PVector_dist_.html
Et tu te sert du rayon de ton ellipse
Dernière modification par matthieu (2016-06-09 15:48:59)
Hors ligne
en fin de compte c'est un carré que je dois faire mais je ne comprend pas (la fatigue du soir surement) comment intégrer mes valeurs à mon bounce, en fait c'est la rédaction qui me pose problème ^^. merci pour ton aide en tout cas
Dernière modification par georges4242 (2016-06-09 17:10:06)
Hors ligne
Je dirais en vitesse sans avoir tester
void bounce() {
if (pos.x < 0 || pos.x > width || (pos.x > 100 && pos.y > 50 && pos.y < 150)) { // à faire pour chaque côté du carré
vel.x *= -1.0f;
}
if (pos.y < 0 || pos.y > height ) {
vel.y *= -1.0f;
}
}
Hors ligne
ah d'accord je vois mais ca va pas créer un conflit entre chacun des cotés non ?
Hors ligne
ah bah non je suis bête j'ai rien dit ^^. bon je vais tester tout ca merci beaucoup
Hors ligne
merci beaucoup du coup j'ai fait comme ca :
if ((pos.x > 380 && pos.x < 600 && pos.y > 150 && pos.y < 350) )
{
vel.x *= -3.0f;
}
if ((pos.x > 380 && pos.x < 600 && pos.y > 150 && pos.y < 350) )
{
vel.y *= -3.0f;
}
Hors ligne
Pages: 1