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

2D Java Discussion :

Tracer une ligne


Sujet :

2D Java

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    Avant de me lancer dans des calculs math de l'époque , vais regarder un peu dans swing. Peut etre y a t il un moyen de creer une Ligne et d ensuite tester si un point passe par cette ligne

    Me semblait avoir vu ca , donc

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    Grrrr pas capable de faire une bete equation du premier degré ... genre ...

    pourtant ca me semble correct ...

    OnClick dans le Tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void mouseClicked(MouseEvent e) {
                    int nbLiaisons = liaisons.size();
                    for (int i = 0; i < nbLiaisons; i++) {
                        Liaison l = (Liaison) liaisons.get(i);
                        Point p1 = l.getP1();
                        Point p2 = l.getP2();
                        if (pointDansLigne(p1, p2, e.getPoint()))
                            System.out.println(l);
                    }
                }
    Et ensuite la methode pointDansLigne qui recoit les deux extremites de la droite + le point où l'on a clicker

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private boolean pointDansLigne(Point p1, Point p2, Point p3) {
            double m = 0;
            if (p1.x>p2.x)
                m = (double)(p1.y-p2.y)/(p1.x-p2.x);
            else
                m = (double)(p2.y-p1.y)/(p2.x-p1.x);
            int p = Math.min(p1.y, p2.y);   
            int y = p3.y;
            int x = p3.x;
            return y == ((m*x)+p);
        }
    Je vois pas ce qui a de mauvais la dedans, j essaie d analyer en faisant des system.out mais je pige pas la logique du pourquoi ca va pas ... saoulant cette histoire.
    Le truc c est que un JPanel se comporte totalement a l opposé d un graphe normal (x grandit en descendant et y aussi), donc ca me fais inverser des trucs, mais là je pense que c est bon :s

  3. #23
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (p1.x>p2.x)
                m = (double)(p1.y-p2.y)/(p1.x-p2.x);
            else
                m = (double)(p2.y-p1.y)/(p2.x-p1.x);
    ta conversion n'est pas bien mise.
    voilà comment ça se passe (à mon avis) :
    - calcul du numérateur -> résultat de type int
    - calcul du dénominateur -> résultat de type int
    - division entière
    - conversion vers double.

    ce qui donne par exemple (18 - 3)/(3 - 1) = 15 / 2 = 7 = 7.
    ce qui devrait être (18 - 3)/(3 - 1) = 15 / 2 = 15. / 2. = 7.5 (par exemple)

    Donc je te conseille plutot un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m = ((double)(p2.y-p1.y))/((double)(p2.x-p1.x));
    Cependant, je suis convaincu que l'une des deux conversions est inutile (je parierais sur la 2e)

  4. #24
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    et tu ne traites pas le cas p1.x = p2.x

    c'est voulu?
    Si t'as une ligne verticale, ça va joliment planter

  5. #25
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    En regardant de plus près, d'autres trucs ne me semblent pas bons...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            if (p1.x>p2.x)
                m = (double)(p1.y-p2.y)/(p1.x-p2.x);
            else
                m = (double)(p2.y-p1.y)/(p2.x-p1.x);
    ça ne sert à rien, car on a le même résultat dans le if et dans le else (mutliplication par -1 en haut et en bas).

    de plus, le p n'est pas bon.
    Si tu veux avoir y = m*x + p, alors p = y - m.x (x et y du même point)

    ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            double m = 0;
            if (p1.x != p2.x) {
                m = ((double)(p1.y-p2.y))/(p1.x-p2.x);
            } else {
                return (p3.x - p2.x) < 3; // explication du 3 juste après
            }
            double p = p1.y - m*p1.x;
    et pour le test, je conseille de faire qqchose de plus large pour éviter le pb d'arrondi et pour pouvoir sélectionner la ligne plus facilement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            double y = p3.y;
            double x = p3.x;
            return (y - ((m*x)+p)) < 3;
    il est peut être nécessaire de caster en double par endroit, j'ai pas vérifié...
    Là ça vérifie que le point appartient à la droite, il reste encore à vérifier que le point appartient au segment, mais le plus dur est fait.

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    J'avais fais cela comme conversion avant mais ca n'allait pas non plus.

    Pour ce qui est de l'inutilité d'un des deux, he bien je trouve que c est utile, voir indispensable, car selon je pourrai avoir un résultat négatif ou un positif ... donc je pourrai passer par ABS mais pas top a ce niveau .

    Voici un exemple de résultat :

    System.out.println(y+"="+((m*x)+p));
    Cette ligne est dans pointDansLigne (...) (voir post précédent) et est apellée a chaque fois que je bouge ma souris.

    Les chiffres ici resultent d un déplacement horizontal de ma souris aux alentours de la ligne

    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
     
    148=165.18297872340426
    148=166.96170212765958
    148=169.62978723404254
    149=170.5191489361702
    149=171.40851063829786
    149=172.29787234042553
    149=173.18723404255317
    149=174.07659574468084
    149=174.96595744680852
    149=175.85531914893616
    149=177.63404255319148
    149=178.52340425531915
    149=180.30212765957447
    149=181.1914893617021
    149=182.08085106382978
    149=182.97021276595743
    149=183.8595744680851
    149=184.74893617021274
    comme tu peux le voir, il est un bon 30 + haut ... et puis meme la partie decimale est tellement grande que jamais ca tombera dessus ...

  7. #27
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Bardack
    Pour ce qui est de l'inutilité d'un des deux, he bien je trouve que c est utile, voir indispensable, car selon je pourrai avoir un résultat négatif ou un positif ... donc je pourrai passer par ABS mais pas top a ce niveau.
    je t'assure que c'est inutile, exemple :
    (5 - 3) / (2 - 1) = 2 / 1 = 2
    (3 - 5) / (1 - 2) = (-2) / (-1) = 2
    on a toujours (a - b) / (c - d) = (b - a) / (d - c).
    Je vois pas quoi te dire de plus là...

    En ce qui concerne le décalage d'environ 25, je me demande si ça vient pas du décalage de l'en-tête de ta fenêtre, car la barre de titre fait entre 20 et 30 pixels de hauteur il me semble.

    Essaie de tracer aussi les coordonées des extrémités, du point où tu cliques, et de cliquer sur une des extrémités.
    comme ça tu verras si ça correspond

  8. #28
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Bardack
    et puis meme la partie decimale est tellement grande que jamais ca tombera dessus ...
    C'est pour ça que je ne fais pas un test d'égalité dans ce que je propose, mais la différence et j'utilise un seuil de tolérance. J'avais mis 3 comme ça, mais d'un point de pratique, je pense que ça devrait rester dans cet ordre de grandeur.

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    en fait je calculais pas de p ... boulet inside ... on voit que les debuts secondaires sont loin. Je m occupe de ca

    en tt cas, merci pour ton aide dans ttes ces questions...

    Car ils sont bien gentils a l'armée (je fais mon stage au ministere de la defense), mais ils ont la notion de rien

  10. #30
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    pas de soucis, c'est en période creuse au boulot, je croule pas sous le travail.

    Donc tu me permets de m'occuper

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    voilà qui fonctionne tolérance de 5

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [FLASH MX2004] Tracer une ligne en temps réel
    Par tomtom- dans le forum Flash
    Réponses: 1
    Dernier message: 16/02/2006, 09h52
  2. Tracer une ligne sur une image
    Par Guillaume602 dans le forum Windows
    Réponses: 5
    Dernier message: 05/01/2006, 20h33
  3. [VB.NET] Tracer une ligne (OnPaint)
    Par Emcy dans le forum Windows Forms
    Réponses: 6
    Dernier message: 24/03/2005, 13h09
  4. [FP]Tracer Une ligne avec Dev-pascal
    Par yffick dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 17/12/2003, 16h33
  5. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22

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