OVH Cloud OVH Cloud

Problème de vector

7 réponses
Avatar
Samba
Bonjour, j'ai un soucis, je crée un vecteur dans lequel je met un tableau
d'objets (x, y et z) de type "param" (deux attributs t et cst), je calcule
ce tableau dans la méthode calculEquationDroite, seulement lorsque je veux
récupérer et afficher les valeurs t et cst des x, y, z de chaque ligne du
vecteur, j'ai une exception "in thread main", et je ne comprends pas
pourquoi.

Voici mon code, et merci d'avance pour toute aide:

//J'ajoute les trois calcul de x, y z
... equationsDroites.addElement(calculEquationDroite(c1[0], c1[1], c1[2],
c2[0],c2[1], c2[2]));
equationsDroites.addElement(calculEquationDroite(c1[0], c1[1], c1[2],
c3[0],c3[1], c3[2]));
equationsDroites.addElement(calculEquationDroite(c2[0], c2[1], c2[2],
c3[0],c3[1], c3[2]));

//affichage des trois equations bugg!!!!!

for (int w = 0; w<equationsDroites.size(); w++){
param[] r = (param[])equationsDroites.get(w);
//System.out.println("Equation n° " + (w+1));
System.out.println("x = " + r[0].t + " t" + "+ " + r[0].cst);
System.out.println("y = " + r[1].t + " t" + "+ " + r[1].cst);
System.out.println("z = " + r[2].t + " t" + "+ " + r[2].cst);
}

//methode de calcul des x, y, z
public param[] calculEquationDroite(double x1, double y1, double z1,
double x2, double y2, double z2){
// (x-x1)/(x2-x1) = (y-y1)/(y2-y1) = (z-z1)/(z2-z1)
// Equation paramétrique de la droite entre les points p1 et p2
// x = t(x2-x1) + x1
// y = t(y2-y1) + y1
// z = t(z2-z1) + z1
//tableau de resultat
param x = new param();
param y = new param();
param z = new param();
param[] result = new param[3];
x.t = x2-x1;
x.cst = x1;
y.t = y2-y1;
y.cst = y1;
z.t = z2-z1;
z.cst = z1;
result[0] = x;
result[1] = y;
result[2] = z;

return result;
}

// la classe param
class param{
public double t;
public double cst;

param(){
t = 0;
cst = 0;
}
}

7 réponses

Avatar
Willy
Le Tue, 30 Dec 2003 01:21:26 +0100, Samba a écrit :


Bonjour, j'ai un soucis, je crée un vecteur dans lequel je met un tableau
d'objets (x, y et z) de type "param" (deux attributs t et cst), je calcule
ce tableau dans la méthode calculEquationDroite, seulement lorsque je
veux récupérer et afficher les valeurs t et cst des x, y, z de chaque
ligne du vecteur, j'ai une exception "in thread main", et je ne comprends
pas pourquoi.

Voici mon code, et merci d'avance pour toute aide:

//J'ajoute les trois calcul de x, y z ...
equationsDroites.addElement(calculEquationDroite(c1[0], c1[1], c1[2],
c2[0],c2[1], c2[2]));
equationsDroites.addElement(calculEquationDroite(c1[0], c1[1],
c1[2],
c3[0],c3[1], c3[2]));
equationsDroites.addElement(calculEquationDroite(c2[0], c2[1],
c2[2],
c3[0],c3[1], c3[2]));

//affichage des trois equations bugg!!!!!

for (int w = 0; w<equationsDroites.size(); w++){
param[] r = (param[])equationsDroites.get(w);
//System.out.println("Equation n° " + (w+1));
System.out.println("x = " + r[0].t + " t" + "+ " + r[0].cst);
System.out.println("y = " + r[1].t + " t" + "+ " + r[1].cst);
System.out.println("z = " + r[2].t + " t" + "+ " + r[2].cst);
}
}


Perso, pour faire ceci, j'utilise plutot un Iterator :
for (Iterator iter=equationsDroites.iterator();iter.hasNext();){
param[] r = (param[])iter.next();
......
}
C'est surtout pratique dans ke cas d'accès concurrents, si ton Vector est
modifié pendant la lecture via Iterator, ce dernier t'envoit une 'tite
exception, çà peut toujours être sympa.

//methode de calcul des x, y, z
public param[] calculEquationDroite(double x1, double y1, double z1,
double x2, double y2, double z2){
// (x-x1)/(x2-x1) = (y-y1)/(y2-y1) = (z-z1)/(z2-z1) // Equation
paramétrique de la droite entre les points p1 et p2 // x = t(x2-x1) +
x1
// y = t(y2-y1) + y1
// z = t(z2-z1) + z1
//tableau de resultat


/*
param x = new param();
param y = new param();
param z = new param();
*/


param[] result = new param[3];


/*
x.t = x2-x1;
x.cst = x1;
y.t = y2-y1;
y.cst = y1;
z.t = z2-z1;
z.cst = z1;
*/

result[0] = new param(x2-x1,x1);
result[1] = new param(y2-y1,y1);
result[2] = new param(z2-z1,z1);

//Me parait un peu mieux que result[0]=x; voir, si tu dois utiliser x,y et
z ailleurs dans ta méthode, utiliser la méthode clone() de Object.
Voir javadoc de Object pour l'implémentation.(Pas le courage à cette
heure-ci)

return result;
}
}
// la classe param
class param {
public double t;
public double cst;

param(){
t = 0;
cst = 0;
}


/**
Pour les modifs ci-dessus
*/
param(int t,int cst){
this.t=t;
this.cst=cst;
}

}
}


Bonne journée/nuit,

--
Willy

Avatar
jz
Samba wrote:
Bonjour, j'ai un soucis, je crée un vecteur dans lequel je met un tableau
d'objets (x, y et z) de type "param" (deux attributs t et cst), je calcule
ce tableau dans la méthode calculEquationDroite, seulement lorsque je veux
récupérer et afficher les valeurs t et cst des x, y, z de chaque ligne du
vecteur, j'ai une exception "in thread main", et je ne comprends pas
pourquoi.
...


Salut

Le pb. vient d'ailleurs.
Quelle est l'exception ?


Voici un programme de test utilisant ton code qui ne plante pas (de là à
dire qu'il affiche des résultats cohérents, c'est une autre histoire :)


import java.util.*;

// la classe param
class param{
public double t;
public double cst;
param(){
t = 0;
cst = 0;
}
}

public class test {
public static param[] calculEquationDroite(double x1, double y1,
double z1, double x2, double y2, double z2){
param x = new param();
param y = new param();
param z = new param();
param[] result = new param[3];
x.t = x2-x1;
x.cst = x1;
y.t = y2-y1;
y.cst = y1;
z.t = z2-z1;
z.cst = z1;
result[0] = x;
result[1] = y;
result[2] = z;
return result;
}

public static void main(String args[]) {
Vector equationsDroites = new Vector();

equationsDroites.addElement(calculEquationDroite(1,2,3,2,3,4));
equationsDroites.addElement(calculEquationDroite(3,2,3,4,4,5));
equationsDroites.addElement(calculEquationDroite(2,1,4,5,3,2));

for (int w = 0; w<equationsDroites.size(); w++){
param[] r = (param[])equationsDroites.get(w);
System.out.println("x = " + r[0].t + " t" + "+ " + r[0].cst);
System.out.println("y = " + r[1].t + " t" + "+ " + r[1].cst);
System.out.println("z = " + r[2].t + " t" + "+ " + r[2].cst);
}
}
}

Avatar
Samba
Bonjour, j'ai essayé ce que vous m'avez conseillé, mais la ligne param[] r (param[])iter.next();
pose problème, exception in main thread.. je ne comprends toujours pas
pourquoi, voici mon code complet si cela peut aider.. c'est une version très
"moche", c'est simplement pour faire des essais.. il n'est pas du tout
optimisé.

Merci
package tc2;
import java.io.*;
import java.util.*;
import java.util.regex.*;

// essai ouverture fichier .vrml
public class essai {

public essai() {
try{
//Ouverture fichier vrml
FileInputStream fichier = new FileInputStream("D:/Mes documents
D/Cours/DEA 2003-2004/PROJET RV/Images 3D/bearing.vrml");
InputStreamReader entree = new InputStreamReader(fichier);
BufferedReader b = new BufferedReader(entree);
String chaine;
Coord coord = new Coord();
Itrnoe itrnoe = new Itrnoe();

//Construction des tableaux de coordonnées de points et des sommets
des faces
while ((chaine = b.readLine())!= null) {

//Récupération des coordonnées des points et construction du tableau
Coord
if (chaine.equals("# Coordonnees des points")){
// pour éviter que la dernière ligne soit prise en compte
chaine = b.readLine();
coord.addPoint(0.0,0.0,0.0);

while (!chaine.equals("]}}}}")){
String[] sa = chaine.split("s+");
coord.addPoint(new Double(sa[1]).doubleValue(), new
Double(sa[2]).doubleValue(),new Double(sa[3]).doubleValue());
chaine = b.readLine();
}
}//Fin construction du tableau des points

//Récupération des faces des triangles et construction du tableau
Itrnoe
if (chaine.equals("# Les faces")){
// pour éviter que la dernière ligne soit prise en compte
chaine = b.readLine();

while (!chaine.equals("]ccw FALSE solid FALSE}}}")){
String[] sa = chaine.split("s+");
itrnoe.addFace(new Double(sa[1]).doubleValue(), new
Double(sa[2]).doubleValue(),new Double(sa[3]).doubleValue());
chaine = b.readLine();
}
}

}//Fin construction des tableaux Coord et Itrnoe

//Essai de construction d'un vecteur des triangles sélectionnés
Vector trianglesSelectionnes = new Vector();
for (int k = 0; k<itrnoe.vec.size();k++){
double[] test = itrnoe.getElement(k);
//Affichage des sommets de ce triangle
for (int j = 0; j<test.length; j++)
System.out.println(test[j]);
System.out.println("n");
//récupération des trois points de ce triangle
int i = (int)test[0];
double[] c1 = coord.getElement(i-1);
i = (int)test[1];
double[] c2 = coord.getElement(i-1);
i = (int)test[2];
double[] c3 = coord.getElement(i-1);

if (appartientIntervalle(0.9, c1[0], c2[0])||
appartientIntervalle(0.9, c1[0], c3[0])||
appartientIntervalle(0.9, c2[0], c3[0])){
System.out.println("Triangle " +k +" selectionnen");
trianglesSelectionnes.addElement(itrnoe.getElement(k));
}
}

//Affichage du vecteur des triangles selectionnes
System.out.println("Les sommets des " + trianglesSelectionnes.size()+"
triangles selectionnes sont :");
for (int m = 0; m<trianglesSelectionnes.size(); m++){
double[] t = (double[])trianglesSelectionnes.get(m);

for (int j = 0; j<t.length; j++)
System.out.print(t[j] +" ");

System.out.println("n");
}

// calcul des equations de droites du premier triangle
// on met les equations de droites dans un tableau
param[] tab = new param[3];
double[] ind = (double[])trianglesSelectionnes.get(0);
System.out.println("les sommets de ce 1er triangle et leurs
coordonnees:");
for (int j = 0; j<ind.length; j++)
System.out.print(ind[j] +" ");
System.out.println("c1");
int i = (int)ind[0];
double[] c1 = coord.getElement(i-1);
for (int j = 0; j<c1.length; j++)
System.out.print(c1[j] +" ");
System.out.println("c2");
i = (int)ind[1];
double[] c2 = coord.getElement(i-1);
for (int j = 0; j<c2.length; j++)
System.out.print(c2[j] +" ");
System.out.println("c3");
i = (int)ind[2];
double[] c3 = coord.getElement(i-1);
for (int j = 0; j<c3.length; j++)
System.out.print(c3[j] +" ");
// on calcul les equations des trois droites, on met le tout dans un
vecteur
Vector equationsDroites = new Vector();
int e1[] = {1,2,3};
int e2[] = {2,3,4};int e3[] = {3,4,5};
equationsDroites.addElement(e1);
equationsDroites.addElement(e2);
equationsDroites.addElement(e3);

for (int u = 0; u<equationsDroites.size(); u++){
System.out.println("boucle " +u);
int[] temp = (int[])equationsDroites.get(u);
System.out.println(temp[0]);
System.out.println(temp[1]);
System.out.println(temp[2]);
}


//bugg!!!!!

//for (int w = 0; w<equationsDroites.size(); w++){
for (Iterator iter = equationsDroites.iterator(); iter.hasNext();){

// the problem seems to be that line!!
param[] r = (param[])iter.next();

System.out.println("x = " + r[0].t + " t" + "+ " + r[0].cst);
System.out.println("y = " + r[1].t + " t" + "+ " + r[1].cst);
System.out.println("z = " + r[2].t + " t" + "+ " + r[2].cst);
}
//}
fichier.close();
}catch(FileNotFoundException e){}
catch (IOException ex){}
}

public boolean appartientIntervalle(double x, double v1, double v2){
if (v1<v2){
if ((x>=v1)&&(x<=v2))
return true;
else return false;
}
else {
if ((x>=v2)&&(x<=v1))
return true;
else return false;
}
}

public param[] calculEquationDroite(double x1, double y1, double z1,
double x2, double y2, double z2){
// (x-x1)/(x2-x1) = (y-y1)/(y2-y1) = (z-z1)/(z2-z1)
// Equation paramétrique de la droite entre les points p1 et p2
// x = t(x2-x1) + x1
// y = t(y2-y1) + y1
// z = t(z2-z1) + z1
//tableau de resultat
param[] result = new param[3];
result[0] = new param (x2-x1, x1);
result[1] = new param (y2-y1, y1);
result[2] = new param (z2-z1, z1);

return result;
}

public static void main(String args[]){
essai e = new essai();
}
}

class param{
public double t;
public double cst;

param(double t , double cst){
this.t = t;
this.cst = cst;
}
}
Avatar
Willy
Le Tue, 30 Dec 2003 10:50:43 +0100, Samba a écrit :

Bonjour, j'ai essayé ce que vous m'avez conseillé, mais la ligne param[]
r = (param[])iter.next();
pose problème, exception in main thread.. je ne comprends toujours pas
pourquoi, voici mon code complet si cela peut aider.. c'est une version
très "moche", c'est simplement pour faire des essais.. il n'est pas du
tout optimisé.


Je pensais que je te l'avais demandé dans mon premier post, mea culpa.
Tu pourrais être un peu plus précis sur ton exception en nous donnant
l'erreur en entier.

@+

--
Willy

Avatar
jz
Samba wrote:
Bonjour, j'ai un soucis, je crée un vecteur dans lequel je met un tableau
d'objets (x, y et z) de type "param" (deux attributs t et cst), je calcule
ce tableau dans la méthode calculEquationDroite, seulement lorsque je veux
récupérer et afficher les valeurs t et cst des x, y, z de chaque ligne du
vecteur, j'ai une exception "in thread main", et je ne comprends pas
pourquoi.
...


Salut

Le problème ne vient pas du code que tu as donné, même s'il pourrait
être un peu plus propre :)

Quelle est l'exception exactement ?

Voici un programme de test utilisant ton code qui ne plante pas:

----------------------------------

import java.util.*;

// la classe param
class param{
public double t;
public double cst;
param(){
t = 0;
cst = 0;
}
}

public class test {
public static param[] calculEquationDroite(double x1, double y1,
double z1, double x2, double y2, double z2){
param x = new param();
param y = new param();
param z = new param();
param[] result = new param[3];
x.t = x2-x1;
x.cst = x1;
y.t = y2-y1;
y.cst = y1;
z.t = z2-z1;
z.cst = z1;
result[0] = x;
result[1] = y;
result[2] = z;
return result;
}

public static void main(String args[]) {
Vector equationsDroites = new Vector();

equationsDroites.addElement(calculEquationDroite(1,2,3,2,3,4));
equationsDroites.addElement(calculEquationDroite(3,2,3,4,4,5));
equationsDroites.addElement(calculEquationDroite(2,1,4,5,3,2));

for (int w = 0; w<equationsDroites.size(); w++){
param[] r = (param[])equationsDroites.get(w);
System.out.println("x = " + r[0].t + " t" + "+ " + r[0].cst);
System.out.println("y = " + r[1].t + " t" + "+ " + r[1].cst);
System.out.println("z = " + r[2].t + " t" + "+ " + r[2].cst);
}
}
}

Avatar
M
Merci beaucoup, j'ai réglé le problème, je ne sais même pas comment à vrai
dire, mais c l'essentiel.

M.
Avatar
Riri
Merci de votre aide, mon problème est réglé