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

VB.NET Discussion :

Rappel mathématiques pour selectionner une droite


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut Rappel mathématiques pour selectionner une droite
    Bonjour , j’aie besoin de quelques rappels mathématiques pour le code ci-dessous (mon bac est vieux de 14 ans) .

    J’analyse un programme qui mets des poignées à une droite dés que celle-ci est sélectionnée à l’écran .
    Px,py sont les coordonnées qui sont cliquées à l’écran*; X1, Y1, X2, Y2 sont les 2 points du segment de droite .
    A partir de ces données un calcul mathématiques est effectué qui permet de déterminé si le point cliqué à l’écran est proche d’une droite ou pas …
    Un matheux pour me donner les bagages géométriques ou le raisonnement mathématiques en bon français …Please …(j’aie pas compris grand choses aux formules)
    .

    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
     ' Return True if this point is on the object.
        Public Overrides Function IsAt(ByVal x As Integer, ByVal y As Integer) As Boolean
            Return PointNearSegment(x, y, X1, Y1, X2, Y2)
        End Function
     
     
    Public Function PointNearSegment(ByVal px As Integer, ByVal py As Integer, ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, Optional ByVal close_distance As Integer = 2) As Boolean
            Return DistToSegment(px, py, x1, y1, x2, y2) <= close_distance
     
    ‘ que signifie close_distance*? pourquoi à son initialisation close_distance = 2 ?
    ‘à quoi sert close_distance*?
     
        End Function
     
     
       Private Function DistToSegment(ByVal px As Integer, ByVal py As Integer, ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As Double
            Dim dx As Double
            Dim dy As Double
            Dim t As Double
     
            dx = X2 - X1
            dy = Y2 - Y1
            If dx = 0 And dy = 0 Then
                ' It's a point not a line segment.
                dx = px - X1
                dy = py - Y1
                DistToSegment = Sqrt(dx * dx + dy * dy)
                Exit Function
            End If
     
            t = (px + py - X1 - Y1) / (dx + dy)  ‘ que signifie t quel terme mathématiques*? pourquoi cette formule et à quoi servent les comparaisons ci-dessous .
     
            If t < 0 Then
                dx = px - X1
                dy = py - Y1
            ElseIf t > 1 Then
     
                dx = px - X2
                dy = py - Y2
            Else
                Dim x3 As Double = X1 + t * dx
                Dim y3 As Double = Y1 + t * dy
                dx = px - x3
                dy = py - y3
            End If
            DistToSegment = Sqrt(dx * dx + dy * dy)
        End Function

  2. #2
    Membre chevronné
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Par défaut
    Bonsoir,

    Sauf erreur de ma part
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t = (px + py - X1 - Y1) / (dx + dy)
    est représentatif de la "projection" du point (px;py) sur le segment (x1;y1)-(x2;y2).

    en image :


    Si t<0 : La projection est en dehors du segment, coté (x1;y1)


    Si 0<t<1 : La projection est dans le segment, t est alors proportionnel à la distance par rapport à (x1;y1)


    Si t>1 : La projection est en dehors du segment, coté (x2;y2)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut
    Ok pour la notion de proportion

    Pour mieux comprendre j'enlève une dimension .
    t ' =(px-X1)/dx 'proportion pour une dimension axe x
    t '= (py-Y1)/dy ' proportion pour une dimension axe y

    Et la formule à 2 dimensions

    t = (px + py - X1 - Y1) / (dx + dy)

    Par contre je n'aurais pas coté t comme tu l'as fait sur le dessin .Cela dessine une distance et pas une proportion .Passons ce détail qui me chiffonne .Le principe est , je pense , compris : la projection ou t (comme "transformation linéaire ") respecte les proportions .

    A partir de ce coeff de proportion je peux déduire x3 qui est l'intersection de la projection sur la droite P1-P2 .
    Et à partir de x3 calculer la longeur de la droite projetée = DistToSegment .

    Ensuite si DistToSegment est petit et que 0<t<1 alors je peux en déduire que j'aie cliqué proche d'un pt quelquonque de la droite P1P2 .

    NB : en espérant ne pas avoir raconté de grosses bêtises ...Juste du flair sans utiliser ni les scalaires (que j'aie oublié) ,ni les équations de droite .

  4. #4
    Membre chevronné
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Par défaut
    Bonsoir,

    Mon post manque totalement de rigueur et il est susceptible -à raison- de faire hurler les puristes. L'objectif était d'imager l'idée de base.

    Pour en revenir à votre problème de départ, définissez une tolérance de clic : une distance en dessous de laquelle vous estimez que l'utilisateur a cliqué sur le segment concerné (genre 5 pixels).
    Si (DistToSegment<tolérance), alors => {évènement clic}

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

Discussions similaires

  1. [Focus] Probleme pour selectionner une JInternalFrame
    Par bulbo dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/05/2009, 13h22
  2. Réponses: 2
    Dernier message: 12/12/2007, 13h53
  3. [batch] Besoin d'aide pour selectionner une imprimante
    Par alex_m94 dans le forum Windows
    Réponses: 3
    Dernier message: 13/09/2007, 14h25
  4. Modification d'une fonction pour selectionner une plage de cellule
    Par jackbauer972 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/08/2007, 15h07
  5. pb pour selectionner une colonne
    Par 123quatre dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/06/2007, 11h54

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