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 :

Tracer des lignes ,arcs de cercle et cercle


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Tracer des lignes ,arcs de cercle et cercle
    Bonjour à tous,

    J'ai un peu regardé les guides de PaintBox etc, mais je pense que ce que je cherche n'y figure pas.

    Voici mon probleme :

    Je voudrais avoir une PaintBox (ou n'importe quel autre objet me permettant de dessiner), pour pouvoir y tracer des cercles, des lignes ou des arcs de cercle, et ensuite récupérer les coordonnées, j'ai bien vu qu'on pouvait un peu tracer tout ça en donnant des coordonnées, mais je voudrais plutôt l'inverse

    Y'aurait il des outils tout prêts pour faire ça ? (c'est beau de rêver)
    Ou alors, vers quelle piste dois je m'orienter.

    Je vous remercie d'avance!

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Donc il s’agirait d’avantage d’analyser une image que de la dessiner ?
    Ou est-ce la récupération (ou mémorisation) des paramètres qui pose problème dans un contexte de dessin à main levé ?

    A plus !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Ah si je voudrais dessiner la figure, mais je n'ai pas trouvé d'outil adéquat. Je pensais que ca existait mais apparamment non.

    Par exemple on aurait le choix entre dessiner une ligne, un arc de cercle, un cercle et ensuite à l'aide de clics sur la PaintBox elle serait dessinée.

    J'espère avoir été clair ? (en gros, cela ferait comme dans Paint, mais avec Borland).

  4. #4
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    il te suffit de jouer avec la souris.

    Tu est capable de récupérer la position de ta souris sur ta PaintBox.
    tu peux également détecter quand celle-ci se déplace avec ou sans bouton enfoncé.

    Il te suffit donc en fonction de la forme que tu veut réaliser, de mémoriser certains paramètres.

    Par exemple

    lorsque tu veux tracer :
    - un cercle, tu mémorise le centre et le rayon de ton cercle.
    - une ligne, le point de départ et d'arrivée
    - un arc, le point de départ, le point d'arrivée, le centre du cercle sur lequel se trouve ton arc et le rayon de ce cercle.
    - un carré (faut mieu le gérer en rectangle question de pratique) : le coin supérieur gauche, la hauteur et la largeur.

    Mais tu va être obligé de gérer cela toi-même

    J'espère avoir été clair

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Je pense que tu as été assez clair, je vais donc créer à côté de ma PaintBox des boutons désignant l'objet à dessiner, et en fonction de ça et des clics cela me dessinera les objets désirés.

    Je vais essayer ça, cela m'a l'air d'être la solution la plus viable.

    Je mettrai en ligne un fichier avec tout le bazar une fois que c'est fini, et je laisse la discussion ouverte au cas où quelqu'un aurait déjà fait la même chose, merci pour vos contributions !

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il suffit d'organiser les événements pour la saisie de manière à ce que :
    - OnMouseDown place un point, par exemple :
    Pour un segment c'est le premier point
    Pour une rectangle c'est l'un des sommets
    Pour le cercle c'est le centre
    ...
    - OnMouseMove dilate la figure, par exemple :
    Pour un segment c'est le deuxième point
    Pour un rectangle c'est le sommet opposé
    Pour le cercle c'est le rayon (ou autre)
    ...
    - OnMouseUp termine l'opération

    On a intérêt à modéliser ces figures à l'aide de classes dédiées, en partant d'une classe de base (c'est ce que je pense !).
    On peut ainsi mettre en place de nombreux mécanismes comme la sélection, les poignées de contrôle autorisant, par exemple, la modification de la taille, de la position etc...

    On peut aussi travailler avec des figures dotées d'une taille par défaut que l'on modifie ensuite à l'aide des poignées de contrôle.

    A plus !

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Note aussi que quand la souris sort d'un controle OnMouseUp n'est pas déclenché.
    Il faut donc faire un SetCapture() pour recevoir ce message quand il advient:
    http://msdn2.microsoft.com/en-us/library/ms646262.aspx

    Ce qui pose aussi un petit problèmes de tracé quand le point de release est en dehors du contrôle.

    Yarp
    www.senosoft.com

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    On peut travailler avec un référentiel relatif au référentiel absolu de la fenêtre.
    On a donc de quoi faire du scrolling (sans scrollbars) que l'on peut d'ailleurs mettre en oeuvre pendant la saisie du dessin !

    A plus !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    De retour de vacances je me remets au boulot!

    Ce que tu as écrit la Henderson est très interessant.

    Comment modélises tu le OnMouseMove? As tu un exemple de code pour une ligne par exemple?

    J'ai essayé de tracer des cercles, mais malheureusement la seule fonction que j'ai trouvé est Ellipse, et je veux juste tracer un cercle en fonction du centre et du rayon, pas des ellipses.

    Je vous remercie pour votre aide qui me fait avancer!

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Le cercle étant un cas particulier de l'ellipse, pour calculer le coin supérieur gauche et le coin inférieur droit (TCanvas::Ellipse) il suffit de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TPoint Centre;
    double Rayon;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Canvas->Ellipse(Centre.x - Rayon,
                    Centre.y - Rayon,
                    Centre.x + Rayon,
                    Centre.y + Rayon);
    Pour la mise en oeuvre des événementielles en cherchant un peu, il y a beaucoup de discussions qui traitent du sujet, et spécialement pour le graphisme (rechercher MoveTo, LineTo sur ce forum) !

    Il existe quand même plusieurs façons de procéder et qui dependent de la manière dont on souhaite rédiger le source !

    Sinon, pour le cercle on peut se baser sur l'idée suivante :

    Dans la OnMouseDown, on fixe Centre à l'aide du couple (X,Y) donné en paramètre comme celui du cercle à l'endroit du clic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Centre = Point(X,Y);
    Rayon = 0.0; //au cas ou le dessin arrive juste après...
    Dans la OnMouseMove, on fait évoluer le rayon au gré du couple (X,Y) donné en paramètre.
    Pour le calcul du rayon, c'est aussi simple que ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rayon = hypot(Centre.x - X, Centre.y - Y);
    Ne pas oublier #include <math.h> pour hypot

    Pour le dessin il suffit donc d'appliquer ce qui est donné plus haut.

    On peut par exemple se servir de Canvas->Pen->Style = pmNot pour :
    - effacer (en redessinant à l'ancienne position ou forme)
    - dessiner (à la nouvelle position ou forme).

    A plus !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bon il faut croire que je ne suis pas trés doué, je n'arrive pas a dessiner de cercle en suivant ta méthode (simplifiée). Voici mon code :


    void __fastcall TForm1:aintBox1MouseDown(TObject *Sender,
    TMouseButton Button, TShiftState Shift, int X, int Y)
    {

    if(Counter_Click == 1)
    {

    Rayon = hypot(X1 - X, Y1 - Y);
    Canvas->Ellipse(X1 - Rayon, Y1 - Rayon, X1 + Rayon, Y1 + Rayon);

    Counter_Click = 0;


    }
    else
    {

    X1 = X;
    Y1 = Y;

    Counter_Click ++ ;
    }

    }
    Counter_Click est initialisé a 0.

    Y'a t'il une erreur évidente? J'ai beau relire le code, je ne vois pas, c'est toujours plus évident de voir les erreurs des autres

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    J'ai donné un exemple il n'y a pas si longtemps !

    A plus !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Merci de me renvoyer vers ce topic, je vais voir ça de ce pas.

    Bonne journée!

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    J'ai essayé ce qui est cité dans le topic, mais toujours rien ...

    J'avoue que je commence à douter là, pourrais tu prendre 5min pour écrire le programme car j'ai réassayé bon nombre de fois, et je n'obtiens rien, arrachage de cheveux en court

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Sans doute parce que le code que j'ai donné permet de dessiner directement sur la form.
    Si tu travailles sur un TPaintBox, c'est donc le canvas de ce PaintBox qui doit être sollicité.

    Donc si :

    Alors :

    A noter qu'il peut être plus intéressant de dessiner directement sur la form, pour une question de fluidité.
    Un TPaintBox représente une couche supplémentaire que le système doit gérer lors du dessin de l'ensemble.

    A plus !

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Oui tu as vu juste, il fallait ajouter PaintBox1->

    En ce qui concerne la rapidité d'execution, elle n'est pas si importante, donc je continue à utiliser la PaintBox, à moins que dessiner directement sur la Form présente d'autres avantages non négligeables?

    Merci pour ton aide précieuse en tout cas, ca avance ca avance.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    J'ai maintenant d'autres problemes.
    Notamment avec les arcs de cercles, en effet, il y une fonction Arc qui requiert 4 points en parametres, alors que je ne veux que 3 points, comment dois je faire dans ce cas la?

    En ce qui concerne les lignes, une fois tracées, je veux pouvoir les étirer, mais ou ca pose probleme, c'est que c'est le bordel pour calculer les nouvelles coordonnées, n'y aurait il pas un moyen tout simple de faire ça?

    Désolé de vous embeter à nouveau, et merci !

Discussions similaires

  1. Pages de garde : tracer des lignes, inclure un graphe, ...
    Par vinzzzz dans le forum Mise en forme
    Réponses: 6
    Dernier message: 24/05/2007, 12h07
  2. Réponses: 6
    Dernier message: 27/04/2007, 22h50
  3. Réponses: 9
    Dernier message: 26/03/2007, 16h58
  4. Tracer des lignes séléctionnables
    Par koolkris dans le forum Langage
    Réponses: 3
    Dernier message: 02/02/2006, 10h12
  5. Recherche de composant pour tracer des lignes
    Par n1portki dans le forum Composants VCL
    Réponses: 5
    Dernier message: 21/09/2005, 01h44

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