Bonjour,
Je ne sais pas si c'est le bon endroit pour poster ce type de question mais je suis dans une impasse:
Je cherche à créer entre le centre de ma scène et mon curseur une espèce de traîne de rectangles, c'est à dire que je voudrais dessiner une suite de rectangles "dynamiques" sur une ligne invisible qui relie mon curseur au centre de ma scène.
Je calcule la distance entre mon centre et mon curseur...:
float monRayon=dist(mouseX, mouseY,centreXscene,centreYscene);
Ensuite je calcule les sinus et cosinus (coté adjacent ou opposé sur hypoténuse(monRayon))... :
float CosmonAngle= (dist(centreXscene, mouseY,centreXscene,centreYscene))/monRayon; float SinmonAngle= (dist(mouseX, centreYscene,centreXscene,centreYscene))/monRayon;
....afin de pouvoir les réutiliser pour placer mes rectangles selon la formule (ici un rectangle à mi-distance entre mon curseur et mon centre de scène):
rect((centreXscene+CosmonAngle*(monRayon/2), (centreYscene+SinmonAngle*(monRayon/2),10,10);
mais cela ne fonctionne pas.
Est-ce que quelqu'un aurait une idée des formules à employer pour créer cette simple animation ?
Merci d'avance.
Dernière modification par saturne-feerique (2009-12-17 17:08:22)
Hors ligne
Bonjour,
Le plus simple pour faire ce genre de choses est de travailler en coordonnées polaires (les coordonnées d'un point sont définies par un angle et une distance) et de convertir au moment de l'affichage pour obtenir des coordonnées cartésiennes. Regarde atan2 par exemple, qui donne l'angle entre un point et le point (0,0). Ce que tu veux faire peut alors être fait comme ça :
int nbrRect = 5; // combien de rectangles dessiner ?
float xCentre, yCentre;
void setup() {
size(600,600);
frameRate(30);
smooth();
rectMode(CENTER);
xCentre = width / 2;
yCentre = height / 2;
}
void draw() {
background(255); fill(0);
drawRectangles(mouseX, mouseY, nbrRect);
}
void drawRectangles(float x, float y, int nbrRect) {
// calculer l'angle entre le pointeur et le centre
float angle = atan2(y - yCentre, x - xCentre);
// calculer la distance entre le pointeur le centre
float distance = dist(x, y, xCentre, yCentre);
float incDistanceStep = distance / (nbrRect - 1);
// dessiner nbrRect rectangles sur la ligne invisible qui sépare
// le centre le pointeur
float xRect = xCentre;
float yRect = yCentre;
float incDistance = 0;
for (int i=0; i <= nbrRect; i++) {
rect(xRect, yRect, 10, 10);
xRect = xCentre + incDistance * cos(angle);
yRect = yCentre + incDistance * sin(angle);
incDistance += incDistanceStep;
}
}Hors ligne
Merci merci merci Emoc.
C'est la manière de calculer l'angle qui me posait problème depuis quelques jours. (principalement).
Ton code est très bien expliqué et documenté – je vais probablement mettre du temps à le digérer et pouvoir y apporter les modif en fonction de mon projet mais je reviendrai ici poster le résultat dès que possible.
Mille merci.
Hors ligne
Bonjour,
Il y a plus simple. Puisque les points sont alignés entre le centre et la souris et qu'ils sont régulièrement espacés, il suffit de jouer sur la linéarité des vecteurs et des indices. Voici le code en reprenant celui proposé par emoc.
int nbrRect = 5; // combien de rectangles dessiner ?
float xCentre, yCentre;
void setup() {
size(600,600);
frameRate(30);
smooth();
rectMode(CENTER);
xCentre = width / 2;
yCentre = height / 2;
}
void draw() {
background(255); fill(0);
drawRectangles(mouseX, mouseY, nbrRect);
}
void drawRectangles(float x, float y, int nbrRect) {
// le vecteur directeur entre le centre et la souris est:
// (x - xCentre, y - yCentre)
// Comme les rectangles sont alignés, chaque vecteur entre le centre et
// un rectangle est une fraction de ce vecteur directeur.
float xRect, yRect;
for (int i=0; i <= nbrRect; i++) { // i=0 correspond au centre, i=nbrRect correspond à la souris
xRect = xCentre + (x - xCentre)*i/nbrRect;
yRect = yCentre + (y - yCentre)*i/nbrRect;
rect(xRect, yRect, 10, 10);
}
}Hors ligne
Merci juan!
Hors ligne
Finalement, en mélangeant plusieurs petites choses, voici le résultat:
http://www.saturne-feerique.net/LABO/videos/c1f/
Hors ligne
Pages: 1