Bonjour !
Je suis en train de faire un travail de programmation Java pour la rentrée : je dois simuler des collisions inélastique en 2 dimensions (c'est loin d'être à 100% réel) ![]()
Je trouve Java vraiment compliqué
, mais j'ai un livre de 800 pages qui m'a bien aidé jusqu'ici !
Mon problème maintenant :
J'ai dessiné sur un panneau un système d'axes, et deux ronds qui représentent les projectiles. J'ai fait ceci en modifiant la méthode paintComponent du panneau (je dis peut-être des bêtises, je m'y connais pas bien, mais en tout cas j'ai utilisé un super.paintComponent dans une méthode paintComponent, puis des g.drawXXXX). Et maintenant j'aimerais que les deux ronds se meuvent à vitesse que je choisirai en direction du centre de mon système d'axes.
Est-ce que quelqu'un pourrait m'aider
![]()
"Et maintenant j'aimerais que les deux ronds se meuvent à vitesse que je choisirai en direction du centre de mon système d'axes. "
Si tu le leur demande gentiment peut-être ?
Non, plus sérieusement, ce n'est pas possible. I.e. sans un moteur physique tu ne peux pas avoir tes deux rond qui se meuvent une fois que tu a fais ce qu'il faut. Par contre, tu peux gérer ça toi même, c'est-à-dire, que tu dois avoir un moyen de mesurer le temps et au sein d'une boucle (ou lorsque tu reçois des messages) tu mets à jour la position de tes ronds en fonction du temps qui s'écoule. Mais ta question est un peu trop général pour qu'on puisse t'aider.
Pour ce que je sais de Java, je pense que c'est bien dans sa philosophie de créer un thread pour ça (qui tourne en boucle pour modifier la position des ronds), sans que l'interface utilisateur ne soit bloquée.
merci, je vois, je vais lire le chapitre sur les threads alors.
J'aurais pensé qu'il y avait une instruction du genre "Cet objet doit bouger de tant de pixels par secondes dans telle direction"
Mais je vais essayer avec une boucle...
non précisément, il n'y a pas de telle instruction (du moins je ne connais pas de langage dans lequel il y en a, donc je ne pense pas qu'il y en aura en Java).
Bonjour !
J'ai lu le chapitre sur les threads, et j'ai à peu près compris !
J'ai essayé de faire un programme avec un ovale qui bouge, mais ça ne marche pas
Voici le programme:
import javax.swing.*; import java.awt.*;
class variable{
static int i = 0;
}
public class Tests{
public static void main (String args[]){
mouvement m1 = new mouvement(200, 50);
m1.start();
fenetre fen = new fenetre();
fen.setVisible(true);
fen.setDefaultCloseOperation(javax.swing.WindowC
onstants.DISPOSE_ON_CLOSE);
}
}
class fenetre extends JFrame{
fenetre(){
setTitle("Test mouvement");
setSize(600, 400);
Container contenu = getContentPane();
pan = new panneau();
pan.setBackground(Color.gray);
contenu.add(pan);
}
private panneau pan;
}
class panneau extends JPanel{
public void paintComponent (Graphics g){
super.paintComponent (g);
g.drawString("Admirez!", 50, 30);
g.drawOval(variable.i, 10, 10, 10);
}
}
class mouvement extends Thread{
mouvement (int nb, long attente){
this.attente = attente;
this.nb = nb;
}
public void run(){
try{
for(int j=0; j<nb; j++){
variable.i++;
//System.out.println(variable.i);
sleep(attente);
}
}
catch (InterruptedException e) {}
}
private int nb;
private long attente;
}
J'ai créé une variable static i, qui grandit de 1 en 1 jusqu'à 200 grâce au thread.
Ensuite j'ai créé un ovale qui a pour coordonnée en x i, donc j'ai pensé que peut-être il avancerait pixel par pixel, mais non....
Ce serait vraiment génial si quelqu'un pouvait me dire ce qu'il ne va pas et préciser comment faire pour que ça joue !
beaucoup !
Donc toi, par exemple, tu confonds les variables mathématiques et les variables en programmation ... (ne fais pas attention si tu n'a pas lu les autres threads du forum).
Il faut qu'à chaque fois que tu modifie i, tu modifie aussi (et en fait tu n'a pas besoin de i donc) les coordonnées de ton ovale. Une variable en programmation prend, à chaque affectation, la valeur de la partie droite de l'affectation. Si cette valeur change, il n'y a pas de raison que la valeur de la variable change (ou alors il faut passer par des mécanismes d'indirection (pointeurs, références, ...), mais ça ne change pas ce que je dit).
Salut,
Voilà une version fonctionnelle (qui aurait encore grand besoin d'améliorations, notamment pour la structure du code et les noms des classes/variables).
J'ai mis le code dans un package (test), c'est une bonne habitude à prendre.
Les noms des classes doivent toujours commencer par une majuscule.
Ne jamais laisser un "catch" vide, tu ne seras pas avertis si quelque chose ne va pas.
La variable i en externe et en statique serait faisable mais ça apporte une complexité qui me semble inutile.
package tests;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.*;
public class Tests extends JFrame{
// Global
public static final int ATTENTE = 50; // temps d'attente entre deux rafraichissements de l'image
private static Panneau pan;
public Tests(){
setTitle("Test mouvement");
setSize(600, 400);
Container contenu = getContentPane();
pan = new Panneau();
pan.setBackground(Color.gray);
contenu.add(pan);
}
public static void main(String args[]) {
Tests test = new Tests();
test.setVisible(true);
Mouvement m1 = new Mouvement(200, pan);
m1.start();
test.setDefaultCloseOperation(javax.swing.WindowCo
nstants.DISPOSE_ON_CLOSE);
}
}
class Panneau extends JPanel {
int positionOvalX = 0;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Admirez!", 50, 30);
g.drawOval(positionOvalX, 10, 10, 10);
}
public void setPositionOvalX(int x) {
positionOvalX = x;
}
}
class Mouvement extends Thread {
Panneau pan;
Mouvement(int nb, Panneau pan) {
this.nb = nb;
this.pan = pan;
}
@Override
public void run() {
for (int j = 0; j < nb; j++) {
pan.setPositionOvalX(j);
pan.repaint();
try {
sleep(Tests.ATTENTE);
} catch (InterruptedException ex) {
Logger.getLogger(Mouvement.class.getName()).log(Le
vel.SEVERE, null, ex);
}
}
}
private int nb;
private long attente;
}
Bonne chance pour la suite.
C'est génial !
Merci beaucoup
J'ai pas encore tout compris, mais je vais essayer de modifier ce programme pour m'y habituer et après me lancer dans la modification du mien !
Par contre, je vois pas à quoi servent ces lignes :
"import java.util.logging.Level;
import java.util.logging.Logger;
@Override
Logger.getLogger(Mouvement.class.getName()).log(Le
vel.SEVERE, null, ex);
Il m'aurait semblé que le programme marcherait sans... ![]()
Ben oui c'est un Logger, qui sert à logger. Donc évidemment ça marche sans.
Par ailleurs il y a une règle simple en programmation GUI, on ne touche pas un widget ou une fenêtre en dehors du thread qui l'a créé. Certaines librairies graphiques signalent immédiatement l'infraction, d'autres comme Swing, font mine de fonctionner puis explosent salement sans prévenir.
Désolé, mais je comprends pas quand vous parlez
Genre "catch" ou "Logger" ou "widget"
Génial, je viens enfin de résoudre le système d'équation qui me posait énormément de problèmes, avec plein de variables etc.
Je l'entre dans Java, un truc monstrueux !
Et Java a pas assez de puissance pour le calculer ![]()
Et c'est un travail très sérieux que je dois faire, je sais pas comment je vais réussir !!!
C'est java qui a *pas assez de puissance* ou c'est plutôt toi qui a pas les connaissances suffisantes pour l'implémenter correctement?
+1 si je peux me permettre.
float B =
variables.masse1*(float)Math.cos(variables.angleRa
dians1)*variables.vitesse1 +
variables.masse2*(float)Math.cos(variables.angleRa
dians2)*variables.vitesse2;
float C = variables.masse1*variables.vitesseAP1;
float D = variables.vitesseAP2*variables.masse2;
float E =
variables.masse1*(float)Math.sin(variables.angleRa
dians1)*variables.vitesse1 +
variables.masse2*(float)Math.sin(variables.angleRa
dians2)*variables.vitesse2;
variables.angleAP2 = (float)Math.random()*2*(float)Math.PI;
variables.angleAP1 = (float)Math.acos((B*B + E*E - C*C - D*D)/2*C*D) + variables.angleAP2;
Désolé, mais ça marche pas.
On peut pas suivre les lois de la physique avec Eclipse...
C'est a quel endroit que ça "marche pas" précisément ?
C'est quoi l'erreur ? (a priori un Java heap memory)
Bon désolé, j'étais un peu énervé, après tout ces jours de travail en même temps...
Je vous explique : ![]()
J'ai réussi grâce à l'aide de mon prof de physique à résoudre en partie un système d'équation qui me posait problème. Ce système contient 3 équations avec :
2 masses connues, 3 vitesses connues, une vitesse inconnue et 2 angles inconnus.
Après résolution, je trouve à quoi est égal la différence des 2 angles, c'est pas une vraie résolution mais ça aurait pu me convenir parfaitement.
Alors je mets à quoi est égal la vitesse inconnue, par rapport à ce qui est connu, ça ça va. Ensuite je définis un des 2 angles, ainsi l'autre est calculé selon le système.
Sauf que l'angle est égal à un gros brouillon de différentes variables au carré multipliées entre elle 36 fois etc., un vrai enfer
! Que j'ai cependant réussi à écrire avec mon clavier.
Et quand je demande à eclipse de m'afficher le résultat, il me met "NaN" (not a number c'est bien ça
). Là je remarque que à la fin de mon calcul, j'ai un arcos, donc je me suis dit que j'ai peut-être fait une erreur de calcul et que l'arcos porte sur un nombre non compris entre [-1;1].
Mais avant de revérifier tout mes calculs, j'ai décidé de changer le "acros" en "arctan", vu que l'arctan est valable sur tout les nombres. Et là, eclipse affiche un nombre, je suis content
! Mais pour en être sûr, je change toutes les valeurs des variables, et surprise, le résultat affiché reste le même.... ![]()
Je suis quasi sûr de pas avoir fait d'erreur de calcul et d'avoir écrit sur eclipse de la bonne manière, donc j'en ai déduit que mon calcul était trop gros pour eclispe...
Qu'est-ce que vous en pensez ?
PS: vraiment désolé pour ce pavé, en plus y'a des choses pas très claires
, c'est un peu dur à tout expliquer comme ça, merci à ceux qui le liront. ![]()
#
Je suis quasi sûr de pas avoir fait d'erreur de calcul et d'avoir écrit sur eclipse de la bonne manière, donc j'en ai déduit que mon calcul était trop gros pour eclispe...
Je voudrai pas paraître agressif mais je pense qu'il y a une grosse bourde dans ton calcul et que tu accuses l'outil à tort au lieu de te remettre en question.
Le logiciel fait ce que tu lui demandes (et c'est encore plus vrai en programmation). Il se fiche un peu de savoir si c'est cohérent ou pas ^^'
Donc, si le résultat que tu as n'est pas bon, soit c'est l'implémentation de ta formule qui déconne, soit la formule elle-même.
"Je suis quasi sûr de pas avoir fait d'erreur de calcul et d'avoir écrit sur eclipse de la bonne manière, donc j'en ai déduit que mon calcul était trop gros pour eclispe..."
C'est pas pour être désagréable, mais ton calcul est absolument minuscule par rapport à ce que l'on peut faire traiter aux ordinateurs usuellement. Il est courant de résoudre des système de plusieurs dizaines de milliers d'équations, de manipuler des matrices avec des millions d'éléments, etc. Donc non, tu n'a pas dépassé les capacité de Java avec ton calcul (Eclipse ne fait rien dans cette affaire, c'est juste l'interface entre toi et java).
Colle un morceau significatif de ton code que un mur (par exemple là : http://pastebin.ca/ ) pour que ce soit plus lisible que sur le forum et on pourra t'aider à déterminer d'où vient ton erreur.
Vous êtes super sympas !
Je suis à peu près obligé de vous passer tout le programme, il fait une dizaine de pages, je sais pas si c'est beaucoup ou pas pour vous.
Bon, je suis un débutant Java, il est TRES loin d'être parfait!
Le voilà :
http://rapidshare.com/filfiles/413699333/Collisions.rar
Le problème se trouve dans le fichier calculTrajec, classe resolutions, méthode systemeVitesse1.
Le monstre est là. (pour voir quand il l'affiche, quand la fenêtre "choix de l'info à donner" apparaît, cliquez sur Vitesse, puis, objet1).
Si vous avez le temps (et l'envie), j'ai aussi un problème dans le fichier simulGraph:
Tout en haut, j'ai mis 2 bouts de ligne entre /* */, normalement ces petits bouts devraient faire que les ronds arrivent au milieu en même temps, mais ça ne marche pas, ça fait que les ronds ne bougent pas, et je ne sais pas pourquoi (ça ne me met pas d'erreur), alors je met un nombre à la place...
Encore ![]()