OVH Cloud OVH Cloud

Division qui renvoie 0

13 réponses
Avatar
Toto Le Ouf
Bonjour à tous,

Mon problème :

//////////////////////////////////////////////////////////////////
int a,x0,x0,y0,y1;
.......
//initiatlisation de x0,x0,y0,y1
......
a = (y1-y0)/(x1-x0);
System.out.println("a = "+a);
......
//////////////////////////////////////////////////////////////////

Cela affiche "a = 0" à chaque fois.

Une idée ??

T.

10 réponses

1 2
Avatar
David JOURAND
//////////////////////////////////////////////////////////////////
int a,x0,x0,y0,y1;
.......
//initiatlisation de x0,x0,y0,y1
......
a = (y1-y0)/(x1-x0);
System.out.println("a = "+a);
......
//////////////////////////////////////////////////////////////////

Cela affiche "a = 0" à chaque fois.

Une idée ??


y1 = y0 ?

--
David Jourand

Avatar
Toto Le Ouf
//////////////////////////////////////////////////////////////////
int a,x0,x0,y0,y1;
.......
//initiatlisation de x0,x0,y0,y1
......
a = (y1-y0)/(x1-x0);
System.out.println("a = "+a);
......
//////////////////////////////////////////////////////////////////

Cela affiche "a = 0" à chaque fois.

Une idée ??


y1 = y0 ?

--
David Jourand



Non, les 4 valeurs x0,x1,y0 et y1 sont bien différentes.
Je suis à bout là... :-)

T.


Avatar
David JOURAND
Je suis à bout là... :-)


Fais un copier/coller de ta méthode ici (sans rien ommettre).

--
David Jourand

Avatar
Toto Le Ouf
Je suis à bout là... :-)


Fais un copier/coller de ta méthode ici (sans rien ommettre).

--
David Jourand


Voici :

////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////
public boolean isSelected(int x, int y){
if(x0 == x1){
if( (x >= x0-3) || (x <= x0+3) ) {
if((y<=y0 && y>= y1) || (y<=y1 && y>= y0)){
return true;
}
else return false;
}
else return false;
}
else{
int a,b,yTheo;
a = (y1-y0)/(x1-x0);
b = y0 - (a*x0);
yTheo = a*x + b;
System.out.println("a = "+a+"; b = "+b+";yTheo = "+yTheo+";y = "+y);
if(yTheo >= y-4 && yTheo >= y+4){
System.out.println("yTheo = "+yTheo+";y = "+y);
return true;
}
return false;
}
}
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////

En réalité, cette méthode appartient à une classe Trait (x0,x1,y0 et y1
représentent les coordonnées de ce trait).
La méthode isSelected sert à tester si l'utilisateur a cliqué sur ce trait
ou non.

Merci.
T.


Avatar
David JOURAND
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////
public boolean isSelected(int x, int y){
if(x0 == x1){
if( (x >= x0-3) || (x <= x0+3) ) {
if((y<=y0 && y>= y1) || (y<=y1 && y>= y0)){
return true;
}
else return false;
}
else return false;
}
else{
int a,b,yTheo;
a = (y1-y0)/(x1-x0);
b = y0 - (a*x0);
yTheo = a*x + b;
System.out.println("a = "+a+"; b = "+b+";yTheo = "+yTheo+";y = "+y);
if(yTheo >= y-4 && yTheo >= y+4){
System.out.println("yTheo = "+yTheo+";y = "+y);
return true;
}
return false;
}
}
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////

En réalité, cette méthode appartient à une classe Trait (x0,x1,y0 et y1
représentent les coordonnées de ce trait).
La méthode isSelected sert à tester si l'utilisateur a cliqué sur ce trait
ou non.


x0, x1, y0 et y1 ne sont pas initialisés dans cette méthode... La source
du problème est sans dout à ce niveau. Affichez x0, x1, y0 et y1 en
même temps que "a" et vous constaterez sans doute que y0=y1.

--
David Jourand

Avatar
Sylvain
Toto Le Ouf wrote on 13/05/2006 16:23:
//////////////////////////////////////
public boolean isSelected(int x, int y){
if(x0 == x1){
...
}
else{
int a,b,yTheo;
a = (y1-y0)/(x1-x0);
b = y0 - (a*x0);
yTheo = a*x + b;
System.out.println("a = "+a+"; b = "+b+";yTheo = "+yTheo+";y = "+y);
if(yTheo >= y-4 && yTheo >= y+4){
System.out.println("yTheo = "+yTheo+";y = "+y);
return true;
}
return false;
}
}


tu devrais directement calculer la distance du point (x,y) à ta droite
(x0,y0;x1,y1) plutot que de calculer l'equation de ta droite (fixe) à
chaque test.

sinon, un bête *double* a = (y1-y0) / (1.0 * x1 - x0); ??

Sylvain.

Avatar
Toto Le Ouf
x0, x1, y0 et y1 ne sont pas initialisés dans cette méthode... La source
du problème est sans dout à ce niveau. Affichez x0, x1, y0 et y1 en
même temps que "a" et vous constaterez sans doute que y0=y1.

--
David Jourand


Je ne pense pas que le problème vienne de là :

- J'ai une autre méthode qui affiche les attributs du trait :
/////////////////////////////////////////////
public String toString() {
return "TRAIT : ("+x0+","+y0+")-("+x1+","+y1+")";
}
/////////////////////////////////////////////

- la mèthode précédente modifiée :
/////////////////////////////////////////////
public boolean isSelected(int x, int y){
if(x0 == x1){
if( (x >= x0-3) || (x <= x0+3) ) {
if((y<=y0 && y>= y1) || (y<=y1 && y>= y0)){
return true;
}
else return false;
}
else return false;
}
else{
int a,b,yTheo;
a = (this.y1-this.y0)/(this.x1-this.x0);
b = this.y0 - (a*this.x0);
yTheo = a*x + b;
System.out.println(this.toString()); //MODIFICATION ICI
System.out.println("a = "+a);
//if(yTheo == y){
if(yTheo >= y-4 && yTheo >= y+4){
System.out.println("yTheo = "+yTheo+";y = "+y);
return true;
}
return false;
}
}
/////////////////////////////////////////////

- exemple de résultat :
/////////////////////////////////////////////
TRAIT : (35,22)-(84,32)
a = 0; b = 22; yTheo = 22; y = 76
/////////////////////////////////////////////


Merci.
T.

Avatar
Toto Le Ouf
tu devrais directement calculer la distance du point (x,y) à ta droite
(x0,y0;x1,y1) plutot que de calculer l'equation de ta droite (fixe) à
chaque test.

sinon, un bête *double* a = (y1-y0) / (1.0 * x1 - x0); ??

Sylvain.


Quelle est la formule qui me permettrait de calculer cette distance ?

Sinon, le *double* n'y fait rien.

T.

Avatar
Sylvain
Toto Le Ouf wrote on 13/05/2006 16:45:

sinon, un bête *double* a = (y1-y0) / (1.0 * x1 - x0); ??


Sinon, le *double* n'y fait rien.


hmmm, rappel: a est la pente ou coeff directeur de ta droite, pour une
droite d'angle (par rapport à 0x) compris entre 0 et 45°, a est compris
entre 0 et 1 - juste un exemple pour dire qu'il ne sera quasi jamais entier.

donc as-tu seulement changé la définition de a (de int en double) ou
changé ta division entière pour en faire une division flottante ?

à ce qu'il me semble:

TRAIT : (35,22)-(84,32)
donne a = 10 / 49 = 0
mais a = 10.0 / 49.0 = 0.204

Sylvain.


Avatar
Sylvain
Toto Le Ouf wrote on 13/05/2006 16:45:
tu devrais directement calculer la distance du point (x,y) à ta droite
(x0,y0;x1,y1) plutot que de calculer l'equation de ta droite (fixe) à
chaque test.


Quelle est la formule qui me permettrait de calculer cette distance ?


pour une droite d'équation ax + by + c = 0, la distance d'un point
M(x,y) à cette droite est:

d = abs( (ax + by + c) / sqrt(a² + b²))

tu travailles ici avec une équation réduite (y = a'x + b') (ie a=a';
b=-1; c=b'), donc tu calcules une fois pour toute (sauf déplacement)
l'équation de ta droite:

double a = (double)(y1 - y0) / (double)(x1 - x1);
double b = y0 - a * x0;
double D = Math.sqrt(a * a + 1);

pour un point M(x,y), tu calcules

d = Math.abs((a * x - y + b) / D);

tes coords étant, j'imagine, des pixels, la distance d est le nombre de
pixels à cette droite, donc un test (d <= 4) doit suffire.

Sylvain.


1 2