IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

progression d'un point sur une droite


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 32
    Points
    32
    Par défaut progression d'un point sur une droite
    Bonjour,
    J'ai posé la même question dans le forum graphisme\2D, et je n'ai pas eu de réponse...
    Je ne sais pas si c'est parce que je la pose au mauvais endroit, ou si les gens ne savaient pas que répondre à ma question.
    J'espère être correct en la repostant ici.

    J'ai tenté de créer une méthode qui défini les coordonnées d'un point qui progresse sur une droite. Cet évenement se passerait toutes les demi-secondes pour donner l’effet de déplacement.
    Tout d'abord il y a un objectif, généré aléatoirement. J'aimerais que le chemin entre l'objectif et la position du point soit divisé par vingt. J'ai également créé des coordonnées "intervalles", c'est là que se téléporterait le point toutes les 1/2 sec.
    Dans le code d'essai que je vous transmettrai plus bas, j'ai utilisé le théorème de pythagore, et j'ai également calculé ma pente pour construire mon équation paramétrique.
    J'ai beaucoup réfléchi, et je pense que les équations paramétriques sont le bon choix pour calculer l'intermédiaire dont j'ai parlé ci-dessus.
    Mais dites-moi tout de suite si vous pensez que je ne prend pas le bon chemin!

    En plus d'être extrêmement brouillon, ce code est rempli de messages d'erreurs!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /*
     * -----prototype-----
     * idées brouillon de ma tête
     * code extrêmement bizzare
     */
    package mathias.maboule;
     
    import java.util.Timer;
    import java.util.TimerTask;
     
    public abstract class Attend extends Timer {
     
    	Timer t;
     
    	 public Attend() {
    		    t = new Timer();
    		    t.schedule(new KaBouge(), 0, 1*1000);//je ne comprend pas l'erreur
    		    }
     
    }

    très importante méthode!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package mathias.maboule;
     
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
     
    public abstract class KaBouge extends TimerTask {
     
    	static Canvas myCanvas = new Canvas();
    	static Random myRandom = new Random();
     
    	public static int objectifX, objectifY, intermediaireX, intermediaireY, deltaX, deltaY, intDistance, pente;
    	public static double doubleDistance;
    	protected static void calculParamétrique(int positionX, int positionY) {
     
    		objectifX = myRandom.nextInt(myCanvas.getWidth());
    		objectifY = myRandom.nextInt(myCanvas.getHeight());
     
    		//deltas
    		deltaX = objectifX - positionX;
    		deltaY = objectifY - positionY;
    		//pente
    		pente = (deltaY) / (deltaX);
     
    		do {
     
    		//distance position du point - objectif
    		doubleDistance = (Math.sqrt(deltaX*deltaX + deltaY*deltaY)) / 20;
     
    		intDistance = (int)doubleDistance;
     
    		//équation paramétrique
    		intermediaireX = positionX + intDistance*pente;
    		intermediaireY = positionY + intDistance;
     
    		} while(objectifX != intermediaireX && objectifY != intermediaireY);
     
    	}	
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package mathias.maboule;
     
    import java.util.*;
    import java.awt.*;
    import javax.swing.*;
     
    public class MiraculeuseFenetre extends Canvas {
     
    	private static final long serialVersionUID = 1L;
    	static Random myRandom = new Random();
    	static JFrame frame = new JFrame("déplacement d'un point");
     
    	static int positionX, positionY;
     
    	public static void main(String[] args) {
     
    		//voici où se trouve le point de départ
    		positionX = myRandom.nextInt(KaBouge.myCanvas.WIDTH);
    		positionY = myRandom.nextInt(KaBouge.myCanvas.HEIGHT);
     
    		frame.setVisible(true);
    		frame.setLocationRelativeTo(null);
    		frame.setSize(500, 500);
     
     
    		public void paint(Graphics g) {//erreur!
     
    		KaBouge.calculParamétrique(positionX, positionY);
    		g.setColor(Color.black);
    		g.fillOval(KaBouge.intermediaireX, KaBouge.intermediaireY, 10, 10);
     
    		}
     
    	}
     
    }
    Je serais très heureux que vous me disiez d'où vous pensez que vient le problème, et ce que je dois améliorer
    D'ailleurs, j'espère ne pas avoir recréé de méthode existante

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    J'ai encore avancé dans mon code.
    J'ai espéré y arriver cette fois en utilisant les Threads. Ce code me satisafait beaucoup plus, mais est toujours bourré d'erreurs.
    Je vous en supplie, répondez à ma question... x)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package ch.mathias.grisebouboule;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.color.*;
    import java.util.Random;
     
    public class ThreadWait extends Thread {
     
    	Thread th;
    	static int positionx, positiony;
     
    	public void run (){
     
    		Random myRandom = new Random();
     
     
    		positionx = myRandom.nextInt(Calcul.myCanvas.HEIGHT);
    		positiony = myRandom.nextInt(Calcul.myCanvas.WIDTH);
     
    		while(Calcul.objectifx != positionx && Calcul.objectify != positiony) {
     
    			public void paint(Graphics g) { //erreur : void is an invalid type for the variable paint
     
     
    				Calcul.calculParametrique(positionx, positiony);
    				g.setColor(Color.black);
    				g.fillOval(positionx, positiony, 10, 10);
    				sleep(500);
    			}
    		}
     
    	}
     
    	public void start() {
    		th = new Thread(this);
    	}
     
    }
    aucune erreur dans cette classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package ch.mathias.grisebouboule;
     
    import java.util.Random;
    import java.awt.*;
    import javax.swing.*;
     
    public class Calcul {
     
    	static int objectifx, objectify, intermediairex, intermediairey, deltax, deltay, intDistance, pente;
    	static double doubleDistance;
     
    	static Canvas myCanvas = new Canvas();
     
    	public static void calculParametrique (int positionx, int positiony) {
     
    		Random myRandom = new Random();
     
    		//génération de l'objectif
    		objectifx = myRandom.nextInt(myCanvas.HEIGHT);
    		objectify = myRandom.nextInt(myCanvas.WIDTH);
     
    		//calcul des deltas
    		deltax = objectifx - positionx;
    		deltay = objectify - positiony;
     
    		//calcul de la pente
    		pente = deltay / deltax;
     
    		//calcul de la distance qui sépare la position de la boule de l'objectif généré aléatoirement
    		doubleDistance = (Math.sqrt(deltax*deltax + deltay*deltay)) / 20;
     
    		//conversion de la distance, pour que les coordonnées de la boule ne soient pas en décimales
    		intDistance = (int)doubleDistance;
     
    		//équation paramétrique (c'est le calcul final de déplacement de la boule)
    		intermediairex = positionx + intDistance*pente;
    		intermediairey = positiony + intDistance;
     
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package ch.mathias.grisebouboule;
     
    import javax.swing.JFrame;
     
     
    import javax.swing.JFrame;
     
    public class StartFenetre extends JFrame {
     
    	StartFenetre(String title) {
     
                    super(title);
    		setVisible(true);
    		msetLocationRelativeTo(null);
    		setSize(600, 600);
    		add(Calcul.myCanvas);// erreur : myCanvas cannot be resolved or is not a field (alors que je l'ai déclaré dans la classe Calcul....)
     
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package ch.mathias.grisebouboule;
     
    public class FinalBoubouleWindows {
     
    	public static void main(String[] args) {
     
    		StartFenetre Fenetre = new StartFenetre("Ma boule avance t-elle?");
    		ThreadWait.start(); // erreur : Cannot make a static reference to the non-static method start() from the type ThreadWait (donc il me propose de le modifier en static)
     
    	}
     
    }

    je change la méthode start() en static(comme me le dit le compiltateur)
    puis, dans la classe ThreadWait (où est déclarée la méthode start), erreur : This static method cannot hide the instance method from Thread
    il me propose d'enlever le "static" de la méthode start... bref x)


    Je vous serais très reconnaissant de m'aider car tout ceci me bloque beaucoup dans l'amélioration de mon projet...
    Comme vous devez le voir, je me donne beaucoup de peine pour expliquer mon problème, et personne de me répond. Dommage.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    En même temps tu as créé un nouveau sujet plutôt que de continuer dans l'ancien et tu postes des mono-blocs de code ce qui rend la lecture peu aisée. Et on a tous des trucs urgents a faire donc on répond selon nos dispos.


    Tu sembles avoir des soucis dans la compréhension de certains concepts : la méthode start() de la classe Thread est une méthode d'instance. Or dans cette notation tu tentes de l'invoquer sur la classe (donc une methode static) ce qui provoque l'erreur du compilateur. Tu dois donc te créer une instance de la classe ThreadWait avant d'invoquer la méthode start().

    Dans ThreadWait, comme précédemment tu définis une méthode dans une méthode ce qui provoque également une erreur du compilateur.

    Une autre erreur, mais de conception, plus avancée : AWT/Swing/Java2D utilise un rendu passif pas actif !
    Passif : on reçoit une demande de rafraîchissement du dessin en provenance du bidule interne chargé de l'affichage et donc on affiche le contenu actuel qui va remplacer l'ancien contenu.
    Actif : on dessine activement sur l’affichage et ça se traduit immédiatement a l’écran. Sauf cas très particuliers, et avec un développeur qui sait ce qu'il fait, AWT/Swing/Java2D ne fonctionne pas comme ça.

    Donc ce n'est pas a ton thread de forcer l'affichage. Ton thread doit juste se contenter de calculer les nouvelles positions et d'invoquer repaint() sur le Canvas ce qui provoquera une demande de réaffichage provenant du bidule interne (bref le gestionnaire d'affichage auquel tu n'as pas accès).

    Le rôle du Canvas, lui, c'est de dessiner les formes et points en fonction des coordonnes actuelles (les dernières mises a jour par le thread ou le timer) et puis c'est tout.

    Chacun son rôle.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 32
    Points
    32
    Par défaut
    Salut,

    Excuse-moi pour mon inactivité; je pensais vraiment que le problème venait de moi(et que personne ne voulait me répondre), par conséquent j'ai arrêter de regarder s'il y a des réponses.
    En plus avec le coronavirus, tout le monde n'est plus toujours sur son ordinateur, c'est compréhensible.
    Je suis également désolé d'avoir posté le code en block, je pensais suivre des conventions

    Je vais essayer d'utiliser la méthode repaint. Merci de ton aide!

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tu as poste 4-5 classes dans un seul bloc de code, le forum rend la chose peu lisible et c'est pas pratique aussi quand tu dois recopier ce code dans un IDE. C'est moi qui ait du éditer ton post pour découper l'affichage et le rendre plus lisible.
    Pour le reste, n’hésite pas a poster ta tentative suivante d'animation.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Progression d'un point sur une droite.
    Par Sticonik dans le forum 2D
    Réponses: 2
    Dernier message: 05/03/2020, 03h54
  2. Projection d'un point sur une droite 3D (et distance)
    Par doom* dans le forum Mathématiques
    Réponses: 2
    Dernier message: 28/03/2012, 17h40
  3. projection d'un point sur une droite
    Par azertyuio dans le forum Mathématiques
    Réponses: 8
    Dernier message: 29/03/2010, 10h20
  4. Projection d'un point sur une droite en dimension N
    Par ToTo13 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 10/01/2009, 17h42
  5. Projection d'un point sur une droite.
    Par méphistopheles dans le forum Mathématiques
    Réponses: 9
    Dernier message: 27/05/2007, 23h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo