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

C++Builder Discussion :

Création d'un segment de droite


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Points : 74
    Points
    74
    Par défaut Création d'un segment de droite
    Salut à tous,

    J’aimerai savoir comment créer un segment de droite de taille déterminée qui passe par un point dont les coordonnées sont connues. (Je travaille sur une image BMP).

    Si vous avez une idée n’hésitez pas à me laisser un message

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonsoir,
    Pour définir ton segment de droite à partir de son point d'origine, et de sa taille, de manière unique, il te faut aussi une direction. L'as tu?

    Cordialement,
    Benjamin

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 421
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 421
    Points : 20 580
    Points
    20 580
    Par défaut
    Citation Envoyé par bahiatoon
    Salut à tous,

    J’aimerai savoir comment créer un segment de droite de taille déterminée qui passe par un point dont les coordonnées sont connues. (Je travaille sur une image BMP).

    Si vous avez une idée n’hésitez pas à me laisser un message
    En 2secondes cela se fait :
    *charger l'image voir aide Borland
    *avec TCanvas adresser les pixels
    *prendre l'algo de Bresenham

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut bahiatoon:
    Peut etre en utilisant LineTo(x, y) et MoveTo(x,y)

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 421
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 421
    Points : 20 580
    Points
    20 580
    Par défaut
    oui sinon avec TCanvas::LineTo et MoveTo

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    lol, apparemment je me suis laissé emporté par les mathématiques .
    Ben oui, pour moi, un point et une taille ne suffisent pas pour déterminer un segment.

  7. #7
    Membre régulier Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Points : 74
    Points
    74
    Par défaut


    Mon segment doit être perpendiculaire à son point d'origine

    A+

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonsoir,
    Désolé, mais un segment perpendiculaire à un point, cela ne me dit rien...
    Si tu me dis perpendiculaire à un segment, à une droite, à une direction, je te comprends, mais à un point, cela me parait trés énigmatique...
    Cordialement,
    Benjamin

  9. #9
    Membre régulier Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Points : 74
    Points
    74
    Par défaut

    Mon segment doit être perpendiculaire à son point d'origine
    ce point est un point contour donc je cherche un segment perpendiculaire à la direction de ce point.

    et je voudrai par la suite faire tourner ce segment dans toutes les autres directions

    A+

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonjour,

    Je ne suis toujours pas trés sure de te suivre. Je vais tout de même te proposer une solution, en partant des hypothèses suivantes:

    Soit Pi = (Pix, Piy), le point initial de ton segment.
    Soit Vect_Pi = (Vect_Pix,Vect_Piy) la direction associé au point Pi (c'est de cette notion que je ne suis pas bien sure de te suivre...).
    Soit Taille, la taille du segment.

    Ce que je pose:
    Soit Pf = (Pfx, Pfy), le point final que tu cherches.
    Soit Vect_Seg = (Pfx-Pix,Pfy-Piy)

    Proposition de résolution:
    Ton segment doit être de taille Taille: Taille*Taille = (Pfx-Pix) * (Pfx-Pix) + (Pfy-Piy) * (Pfy-Piy)
    Ton segment doit être perpendiculaire à la direction Vect_Pi, soit le produit scalaire entre Vect_Pi et Vect_Seg doit être nul:
    Vect_Pix * (Pfx-Pix) + Vect_Piy * (Pfy-Piy) = 0

    Aprés résolution tu obtiendras (j'ai la flemme d'écrire le détail):

    pfx = Pix + Taille * sqrt(1/(1+Vect_Pix*Vect_Pix/(Vect_Piy*Vect_Piy)))
    pfy = Piy + Taille * sqrt(1/(1+Vect_Piy*Vect_Piy/(Vect_Pix*Vect_Pix)))
    Tu peux changer le signe (pfx = Pix - Taille * sqrt(1/(1+Vect_Pix*Vect_Pix/(Vect_Piy*Vect_Piy))) suivant la direction de la perpendiculaire que tu veux.


    Exemple d'application:
    Ce petit bout de code demande à l'utilisateur de cliquer sur la forme pour definir le point initial.
    Le segment dessiné est orthogonal à la direction donné par la position de la sourie.

    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
     
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    //Déclaration d'un type point et d'un type vecteur
    typedef struct {
              int x,y;
            } Vecteur2D;
     
    typedef struct {
              int x,y;
            } Point2D;
     
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            void __fastcall OnDrawSeg(TObject *Sender, TShiftState Shift,
              int X, int Y);
            void __fastcall OnSelectInitPoint(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
    private:	// User declarations
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
            //Declaration du point initial
            Point2D Pi;
            //Declaration de Pf
            Point2D Pf;
            int SegSize;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    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
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #include <Math.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
      //Initialisation de Pi
      Pi.x = 0;
      Pi.y = 0;
     
      //Initialisation de Pf
      Pf.x = 0;
      Pf.y = 0;
     
      //Initialisation de SegSize
      SegSize = 200;
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::OnDrawSeg(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
      if (Pi.x == 0 || Pi.y == 0) return;
     
      //Je pose Vect_Pi comme étant la direction entre Pi et la position courante
      //de la sourie
      Vecteur2D Vect_Pi;
      Vect_Pi.x = X-Pi.x;
      Vect_Pi.y = Y-Pi.y;
     
      if (Vect_Pi.x == 0 || Vect_Pi.y == 0) return;
     
      //Dessin du segment precedent pour l'effacer (mode Xor)
      if (Pf.x != 0 && Pf.y != 0){
        this->Canvas->Pen->Color = clRed; //couleur du crayon
        this->Canvas->Pen->Mode = pmXor;
        this->Canvas->MoveTo(Pi.x,Pi.y);
        this->Canvas->LineTo(Pf.x,Pf.y);
      }
     
      //Calcul de pf
      if (Vect_Pi.x>0)
        Pf.x = Pi.x + SegSize * sqrt(1./(1.+ (double)Vect_Pi.x*(double)Vect_Pi.x/((double)Vect_Pi.y*(double)Vect_Pi.y)));
      else
        Pf.x = Pi.x - SegSize * sqrt(1./(1.+ (double)Vect_Pi.x*(double)Vect_Pi.x/((double)Vect_Pi.y*(double)Vect_Pi.y)));
     
      if (Vect_Pi.y>0)
        Pf.y = Pi.y - SegSize * sqrt(1./(1.+ (double)Vect_Pi.y*(double)Vect_Pi.y/((double)Vect_Pi.x*(double)Vect_Pi.x)));
      else
        Pf.y = Pi.y + SegSize * sqrt(1./(1.+ (double)Vect_Pi.y*(double)Vect_Pi.y/((double)Vect_Pi.x*(double)Vect_Pi.x)));
     
      //Dessin du segment
      this->Canvas->Pen->Color = clRed; //couleur du crayon
      this->Canvas->Pen->Mode = pmXor;
      this->Canvas->MoveTo(Pi.x,Pi.y);
      this->Canvas->LineTo(Pf.x,Pf.y);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::OnSelectInitPoint(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      //affectation du point initial
      Pi.x = X;
      Pi.y = Y;
    }
    //---------------------------------------------------------------------------
    En espérant t'avoir aidé...

    Cordialement,
    Benjamin

Discussions similaires

  1. Distance d'un point à un segment de droite
    Par defluc dans le forum Mathématiques
    Réponses: 63
    Dernier message: 08/09/2009, 00h49
  2. Étirer un segment de droite
    Par defluc dans le forum Mathématiques
    Réponses: 6
    Dernier message: 25/02/2009, 00h57
  3. Segments de droites à partir de points
    Par MetalGeek dans le forum Mathématiques
    Réponses: 7
    Dernier message: 18/02/2009, 13h43
  4. Réponses: 3
    Dernier message: 22/06/2008, 17h06
  5. création de répertoire, fichiers et droits
    Par pastaska dans le forum C
    Réponses: 1
    Dernier message: 05/12/2007, 13h32

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