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

Mathématiques Discussion :

Déterminer de quel coté d'une droite on a cliqué


Sujet :

Mathématiques

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 198
    Points : 171
    Points
    171
    Par défaut Déterminer de quel coté d'une droite on a cliqué
    Bonjour à tous,

    je programme quelques macros sur AutoCAD et je cherche un moyen efficace pour savoir de quel coté d'une droite quelconque dans un plan je clique.

    Ma droite est définie par 2 points A(x1,y1) et B(x2,y2) et j'ai un point M(x,y) qui n'est pas sur la droite.

    Pour l'instant, la méthode que j'ai trouvée, mais qui ne fonctionne pas correctement, c'est de calculer l'angle que j'ai entre AB et AM.
    Ca ne fonctionne pas toujours, car les angles retournés sont entre + ou - [0 2PI]

    Je me demandais s'il y avait une autre astuce pour faire ça, l'idée étant de trouver le sens du vecteur perpendiculaire à AB dans le plan.

    Merci,

    Jean-Marc


    Edit : j'ai trouvé l'astuce il suffisait de passer par les équations de 2 droites perpendiculaires... Tellement évidente qu'elle ne m'était pas passée par la tête immédiatement

    JM

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par OtObOx Voir le message
    Edit : j'ai trouvé l'astuce il suffisait de passer par les équations de 2 droites perpendiculaires... Tellement évidente qu'elle ne m'était pas passée par la tête immédiatement
    Euh... oui mais il y a encore plus simple.
    Une seule équation droite suffit.
    - Si la droite passant par tes deux points (A,B) est y=ax+b, et que tu souhaites savoir où est ton point M(X,Y)
    - tu calcules aX+b
    - si ax+b > Y alors ton point est en dessous de la droite, sinon il est au dessus.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 198
    Points : 171
    Points
    171
    Par défaut
    Tu as raison, c'est beaucoup plus simple ainsi Merci pour ce truc que je ne connaissais pas ! Difficile de se remettre au programme de 3e quand ça fait plus de 20 ans qu'on a quitté les bancs de l'école !

    Jean-Marc

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    - Si la droite passant par tes deux points (A,B) est y=ax+b, et que tu souhaites savoir où est ton point M(X,Y)
    - tu calcules aX+b
    Moué ! Ce n'est pas encore le plus simple et il y a deux problèmes :
    - impossible de le déterminer pour une droite verticale
    - l'équation n'indique pas du quelle coté se trouve M par rapport au vecteur AB. par exemple une rotation de 180° des points A, B et M ne donne pas le même résultat.

    La formule générale est plutôt : signe de "(A^B).M"

    "^" : étant le produit vectoriel
    "." : étant le produit scalaire

    soit (A^B).M = ((Ax, Ay, 1)^(Bx, By, 1)).(Mx, My, 1)

    = (Ay - By)*Mx + (Bx - Ax)*My + (Ax.By - Ay.Bx)

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 198
    Points : 171
    Points
    171
    Par défaut
    La solution de Toto13 est simple, mais elle ne convenait pas à mes besoins. La finalité de ma fonction étant de trouver le vecteur unitaire perpendiculaire à une droite et de direction donnée par le clic. J'ai donc écrit quelques procédures qui fonctionnent très bien.

    Je les donne ici, c'est pour AutoCAD, et elles ne sont pas optimisées pour certaines, mais elles marchent ! Comme je travaille en 3d, je convertis mes points dans le plan du SCU courant (SCU=Système de Coordonnées Utilisateurs, différent du SCG=Système de Coordonnées Générales) puisque les fonctions ne sont valables que dans le plan.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    '---------------------------------------------------------------------------------------
    ' Procedure : RejetEpaisseur
    ' Auteur    : Jean-Marc
    ' Date      : 29/03/2010
    ' Sujet     : Cette fonction retourne un vecteur de longueur 1 perpendiculaire à une
    '             droite définie par 2 points pd et pa et de sens allant vers le 3e point
    '             cliqué. Protection si le pt cliqué est sur la droite.
    '---------------------------------------------------------------------------------------
    '
    Private Function RejetEpaisseur(pd As Variant, pa As Variant, pm As Variant, message As String) As Variant
    Dim pr, v
    Dim ppSCU, prSCU, pdSCU, paSCU, vSCU
     
       On Error GoTo RejetEpaisseur_Error
     
        Do
            pr = ThisDrawing.Utility.GetPoint(pm, message) 'Rejet d'épaisseur dans SCG
            prSCU = ThisDrawing.Utility.TranslateCoordinates(pr, acWorld, acUCS, False)
            paSCU = ThisDrawing.Utility.TranslateCoordinates(pa, acWorld, acUCS, False)
            pdSCU = ThisDrawing.Utility.TranslateCoordinates(pd, acWorld, acUCS, False)
            ppSCU = DroitePerpPassantParUnPoint(pdSCU, paSCU, prSCU)
            vSCU = vect3d(ppSCU, prSCU) 'Vecteur direction dans le SCU
            If longVecteur3d(vSCU) <> 0 Then Exit Do
            MsgBox "Vous avez cliqué sur la ligne !", vbCritical, "Erreur"
        Loop
        vSCU = vectUnit3d(vSCU) 'Vecteur unitaire dans le SCU
        v = ThisDrawing.Utility.TranslateCoordinates(vSCU, acUCS, acWorld, True) 'Convertion dans SCG
        RejetEpaisseur = v
     
       On Error GoTo 0
       Exit Function
     
    RejetEpaisseur_Error:
     
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") dans la procédure RejetEpaisseur du Module Cornieres"
        RejetEpaisseur = Null
    End Function
     
    '---------------------------------------------------------------------------------------
    ' Procedure : DroitePerpPassantParUnPoint
    ' Auteur    : Jean-Marc
    ' Date      : 29/03/2010
    ' Sujet     : Cette fonction donne le point d'intersection M de deux droites
    '             perpendiculaires AB et AM
    '---------------------------------------------------------------------------------------
    '
    Private Function DroitePerpPassantParUnPoint(ptA As Variant, ptB As Variant, ptC As Variant) As Variant
    Dim Xa As Double, Ya As Double
    Dim Xb As Double, Yb As Double
    Dim Xc As Double, Yc As Double
    Dim ptD(0 To 2) As Double
    Dim a As Double, b As Double
    Dim a1 As Double, b1 As Double
     
       On Error GoTo DroitePerpPassantParUnPoint_Error
     
    Xa = ptA(0): Ya = ptA(1)
    Xb = ptB(0): Yb = ptB(1)
    Xc = ptC(0): Yc = ptC(1)
    If (Xb - Xa) <> 0 Then
        a = (Yb - Ya) / (Xb - Xa)
        b = Ya - a * Xa
        If a <> 0 Then
            a1 = -1 / a
            b1 = Yc - a1 * Xc
            ptD(0) = (b1 - b) / (a - a1)
            ptD(1) = a * ptD(0) + b
        Else 'Droite horizontale
            ptD(0) = Xc
            ptD(1) = Ya
        End If
    Else 'Droite verticale
        ptD(0) = Xa
        ptD(1) = Yc
    End If
    ptD(2) = ptC(2)
    'ptD(2) = ptA(2)
    DroitePerpPassantParUnPoint = ptD
     
       On Error GoTo 0
       Exit Function
     
    DroitePerpPassantParUnPoint_Error:
     
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") dans la procédure DroitePerpPassantParUnPoint du Module Cornieres"
    End Function
     
     
     
    'Défini un vecteur3d à partir de 2 points
    Private Function vect3d(pointA As Variant, pointB As Variant) As Variant
    Dim Tableau(0 To 2) As Double
        Tableau(0) = pointB(0) - pointA(0)
        Tableau(1) = pointB(1) - pointA(1)
        Tableau(2) = pointB(2) - pointA(2)
        vect3d = Tableau
    End Function
     
     
     
    'Calculer la norme d'un vecteur 3d
    Private Function longVecteur3d(vecteur As Variant) As Double
    longVecteur3d = Sqr(vecteur(0) ^ 2 + vecteur(1) ^ 2 + vecteur(2) ^ 2)
    End Function
     
     
     
    'Défini en 3d le vecteur unitaire d'un vecteur
    Private Function vectUnit3d(vecteur) As Variant
    Dim Tableau(0 To 2) As Double
    Dim longueur As Double
        longueur = longVecteur3d(vecteur)
        Tableau(0) = vecteur(0) / longueur
        Tableau(1) = vecteur(1) / longueur
        Tableau(2) = vecteur(2) / longueur
        vectUnit3d = Tableau
    End Function
    Je vais cependant creuser ce que tu disais, à propos du produit vectoriel et du produit scalaire, car j'ai régulièrement besoin de savoir de quel coté ce situe un point par rapport à une droite.

    Jean-Marc

  6. #6
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Comment définis-tu les "côtés" ?
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 198
    Points : 171
    Points
    171
    Par défaut
    Je pointe dans le vide sur un des deux cotés de la droite à l'écran (ou je rentre un point déjà calculé), et la fonction RejetEpaisseur me retourne un vecteur, de longueur 1, qui est perpendiculaire à la droite, et qui va dans la direction du coté où j'ai sélectionné.
    Ensuite, que le vecteur soit en bas, en haut, à gauche ou à droite, je m'en fiche, je recherchais uniquement le sens du vecteur perpendiculaire !

    Jean-Marc

  8. #8
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    c'est plus facile quand la question est précise
    en oubliant la normalisation, tu dois choisir entre le vecteur V de coordonnées
    ( -(y2-y1),(x2-x1)) et son opposé.
    si le produit scalaire de ce vecteur avec AM :
    -(y2-y1)*(x-x1)+(x2-x1)*y-y1) est
    nul : M est sur la droite AB
    positif :OK
    négatif : prends l'opposé(-V)
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/12/2011, 18h09
  2. Comment déterminer si une droite rencontre un obstacle
    Par touftouf57 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 29/10/2010, 09h37
  3. Déterminer les coefficients moyens d'une équation linéaire
    Par Oliveuh dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 11/01/2005, 23h23
  4. [Compilation] A quel moment pour une application ?
    Par Rick1602 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/03/2004, 20h36
  5. [MATH] Point par rapport à une droite
    Par teska dans le forum Mathématiques
    Réponses: 6
    Dernier message: 14/05/2003, 16h11

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