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 :

Retirer un point d'une Line2D


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut Retirer un point d'une Line2D
    Bonjour,
    Mathématiquement, une Line2D c'est un segment [AB] avec A et B inclus. Je voudrais m'occuper du segment [AB[ (B exclu). Je voudrais donc retirer le point B de ma Line2D (genre maLigne.remove(B); ) mais j'ai pas trouvé quoique ce soit permettant ce genre de truc.
    L'autre solution consisterait à diminuer la ligne en modifiant l'abscisse et l'ordonnée de B, mais c'est moins "élégant" et surtout plus sujet à caution. De combien modifier pour quand même traiter quasiment toute la ligne ? (en plus il va falloir passer par un calcul de la pente et retirer une valeur modulée par sinus ou cosinus pour respecter la pente)

    merci pour votre aide,
    Bon code,
    kerinel

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    La réponse est peut être dans la description du problème.
    Peux tu nous donner un exemple de code qui utiliserait un segment de type [AB[?

  3. #3
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    bonjour,
    je souhaite tester si un polygone dont un angle vient d'être déplacé se croise ou non (pour "interdire" un polygone croisé). Pour cela je prend les deux arrêtes adjacentes et je teste l'intersection avec toutes les autres arrêtes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //tableauDeLigne est une ArrayList de Line2D
     
    //indiceArrete1 et indiceArrete2 sont les indices des deux arrêtes modifiées qu'il ne faut pas tester contre elle même bien sur
     
    //arrete1 et arrete2 sont des Line2D et sont les arrêtes modifiées
     
    for (int i=0;i<tableauDeLigne.size();i++){
        if ( i != indiceArrete1) && (i != indiceArrete2){
            if (arrete1.intersects(tableauDeLigne.get(i) || arrete2.intersects(tableauDeLigne.get(i)){
                //C'est pas bon: rejeter les modifications
            }
        }
    }
    Or l'arrête i et l'arrête i+1 s'intersectent (heureusement ) sur l'angle commun. Donc si on teste avec le code tel quel, on trouve naturellement une intersection, l'angle commun (en fait les deux angles voisins de celui qui vient d'être déplacé). donc on va rejeter tout le temps...
    Pour éviter cela il y a deux possibilités :
    - ne pas tester avec l'arrête suivante. Euclide a bien démontré que deux segments ne peuvent pas se couper en 2 points (vu qu'il y en a déjà un...). Mais si les deux arrêtes sont exactement superposées, ça passe quand même...
    - retirer préalablement le point commun. si il y a un autre point commun, c'est que les deux segments sont superposés donc ce n'est pas bon.

    Voilà pour quoi je veux enlever ce point. La solution pourrait être d'enlever un "petit bout" de l'arrête mais j' introduit la possibilité que ne vienne se glisser entre l'angle et la nouvelle extrémité un autre angle comme sur le petit dessin ci -joint
    En bleu, l'angle et ces deux arrêtes avant déplacement. On voit que le polygone n'est pas croisé, même si un peu bizarre, tout va bien. En vert, le même après déplacement. Pour éviter le problème de l'angle commun, je retire de ma ligne la petite partie en vert foncé. Mais voilà, du coup je "rate" la belle aiguille rouge qui intersecte bien. Donc je vais accepter le polygone alors que je devrai le refuser.
    D'accord en pratique, si je diminue d'un quart de poil de chouillème, j'ai peu de chance de rencontrer une telle situation. Mais c'est quand même pas impossible donc ce n'est pas une solution élégante d'une part, fiable d'autre part. donc je ne dois retirer que le point.

    merci

    bon code.
    kerinel
    Images attachées Images attachées  

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Il n'y a qu'en math qu'un point n'a pas d'épaisseur.

    Dans ton cas il me semble que tu sois obligé d'avoir une zone de tolérance. D'une taille équivalent à un pixel a priori. Non ?

  5. #5
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Bonjour,
    Il faudrait alors se tourner vers une API spécialisée pour les calculs mathématiques mais ce serait un peu exagérer.
    Concernant la diminution, oui ce serait possible mais pas forcément de 1 pixel partout . En effet si on fait x1-1 et y1-1 par exemple, on va alors aussi modifier la pente si elle est différente de 45 °. Si une diminution doit être appliquée on doit tenir compte de cette pente et appliquer une diminution de l'ordre de sin alpha pour y et cosinus alpha pour x. C'est tout à fait faisable car Line2D peut être instancier en Double ou Float (donc même pas question de pixel en fait).
    Quoiqu'il en soit j'ai EUREKA la solution comme aurait dit l'autre. Ah ben non l'autre c'est Archimède pas Euclide et c'est grâce à Euclide que j'ai pu résoudre mon problème. Pas la question d'obtenir [AB[, qui elle reste ouverte au fond, seulement mon problème d'intersection.
    tout est là
    j'ai ouvert un autre post car ce n'est plus trop le même problème .

    merci
    Bon code
    kerinel

Discussions similaires

  1. Mesure distance entre 2 points d'une image
    Par vexal dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/05/2005, 14h29
  2. Calque -> Un point sur une carte de france
    Par TATAYET dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/04/2005, 14h48
  3. [LG]Retirer les blancs dans une chaine
    Par Andy_24DB dans le forum Langage
    Réponses: 16
    Dernier message: 25/02/2004, 16h30
  4. Réponses: 11
    Dernier message: 24/07/2003, 09h24

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