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

Windows Forms Discussion :

intérieur d'une surface et picturebox(bitmap)


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut intérieur d'une surface et picturebox(bitmap)
    bonjours a tous,
    encore une question de taille ,
    j'effectue le balisage d'un champ agricole. (tout fonctionne très bien).

    je reprend les coordonnées, je les affiche sur une picturebox via une bitmap.

    ce que je veux faire, c'est interagir avec la picturebox ou la bitmap.
    j'aurai besoin de savoir si je suis a l'intérieur ou a l'extérieur de mon champ, pour cela je propose l'acquisition de la coordonnée a laquelle je suis en temps réel par exemple a l'intérieur du champ et je voudrai faire un aller a gauche et un aller a droite virtuel pour rencontrer les 2 bords de mon champs ( si on touche les deux bord c'est que l'on est a l'unterieur du champs).... seulement je ne sais pas comment je peux faire pour savoir si ca rencontre les points de ma bitmap

    avis au amateur de réponses qui aurait une idées

  2. #2
    Membre actif Avatar de Neiflheim
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2011
    Messages : 135
    Points : 269
    Points
    269
    Par défaut
    Bonjour,

    J'entrevois des solutions, mais pourrais tu, par exemple, nous fournir un petit screen de la bitmap et d'un champ en question?

    Pour rajouter une image tu peux simplement ajouter une pièce jointe à ton message en l'éditant, je découvre les possibilités de ce forum
    si mon message a été utile - si je suis à côté de la plaque - quand vous avez la réponse à votre question

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    chez moi ca fonctionne pas , il veut pas fonctionner mais en gros le champ est delimité sur la picturebox et peut avoir n'importe quelle forme

  4. #4
    Expert éminent sénior

    Avatar de Deepin
    Homme Profil pro
    Ingénieur - Chef de projet Modélisation/Simulation
    Inscrit en
    Avril 2004
    Messages
    3 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Ingénieur - Chef de projet Modélisation/Simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 164
    Points : 51 026
    Points
    51 026
    Par défaut
    Citation Envoyé par ojhoj Voir le message
    chez moi ca fonctionne pas , il veut pas fonctionner mais en gros le champ est delimité sur la picturebox et peut avoir n'importe quelle forme
    tu n'arrives pas à rajouter ton image en pièce jointe ?

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par ojhoj Voir le message
    ce que je veux faire, c'est interagir avec la picturebox ou la bitmap.
    j'aurai besoin de savoir si je suis a l'intérieur ou a l'extérieur de mon champ, pour cela je propose l'acquisition de la coordonnée a laquelle je suis en temps réel par exemple a l'intérieur du champ et je voudrai faire un aller a gauche et un aller a droite virtuel pour rencontrer les 2 bords de mon champs

    pour faire cela il faut que tu aies un référentiel; utiliser une bitmap c'est une très mauvaise idée parce qu'une bitmap c'est un ensemble de points une matrice n par n points.
    Donc rien dans cette matrice n'indique si tu as des murs ou bien des cercles..
    tu peux passer par des méthodes de traitement d'image et de reconnaissance de forme mais c'est compliqué et pointu à mettre en oeuvre.
    Il faut que la bitmap n'ait pas de bruit que l'image soit parfaitement claire.

    Sinon sans référence précise qui t'indique que tel ou tel objet se situe à des coordonnées précises je ne vois vraiment pas...

    Citation Envoyé par ojhoj Voir le message
    seulement je ne sais pas comment je peux faire pour savoir si ca rencontre les points de ma bitmap
    si tu sais que la bitmap représente les limites du champs c'est pas compliqué mais il faut impérativement que tu disposes d'informations sur l'échelle du plan.
    Si tu sais que x pixels représentent 100 m avec une simple règle de trois tu peux avoir le déplacement en mètres du déplacement de la souris sur n pixels

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    et si je passe uniquement par la picturebox directement?

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    seulement je ne sais pas comment je peux faire pour savoir si ca rencontre les points de ma bitmap
    A partir de quelles données as-tu tracé le contour du champ?
    Est-ce que tu as une suite de coordonées GPS qui définit le contour du polygone?
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    oui ce sont les coordonnées gps recue en temps reel

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pas besoin du Bitmap. Il suffit par exemple de vérifier le nombre d'intersections (pair=extérieur, impair=intérieur) d'une demi-droite partant du point choisi avec les segments composant les cotés du polygone.

    Il y a dans le forum algorithme de nombreux post sur l'appartenance d'un point à un polygone.
    Exemple : http://www.developpez.net/forums/d14...oint-polygone/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut on comprend un peu mieux maintenant effectivement pas besoin de picturebox ou de bitmap.
    S'il faut tester si un point est dans un polygone en complément de la méthode de Graffito il y a une fonction du GDI ( donc implémentée dans gdi+ sous .NET ) qui permet cela.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    MAT.m ,je ne comprends pas ce que tu m'as dit , je suis novice en la matière, tu saurai m'expliquer plus simplement, avec des exemple a la limite ca serait

  12. #12
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut PATH.ISVISIBLE
    Bonjour Ohjoe
    comme l'as dit Mat.m,tu dois "deeper" un peu plus dans gdi+.
    1-crees un tableau de points (p1,p2,......) pour dessiner un polygone "champ"(ca me rapelle le polygone de tir).

    2/-crees un Graphics.Path sur ton PictureBox
    3/-ajoute le polygon au graphics.path

    4/-appelle la methode IsVisible (pointTest) du graphics.path pour savoir si le point est contenu ou non dans le polygone
    code exemple:
    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
     
    Imports System.Drawing.Drawing2D
    Public Class Form3
        Private g As Graphics
        Private ArrayChamp As Point() = Nothing
        Public Sub New()
     
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
        End Sub
     
     
        Private Sub btnCreePolygonChamp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreePolygonChamp.Click
            ' Cree un tableau de points du champ.
            ArrayChamp = New Point() {New Point(33, 30), New Point(50, 20), _
            New Point(67, 30), New Point(60, 50), New Point(40, 50)}
     
            ' Create un Graphics  du picturebox
            g = Graphics.FromHwnd(Me.PictureBox1.Handle)
     
     
        End Sub
        Private Sub PictureBox1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
            'Cursor en croix
            Cursor = Cursors.Cross
     
            'Un point arbitraire
            Dim ptArbitraire As Point = e.Location
     
            'Test 
            Dim dansChamp As Boolean = False
     
            If g IsNot Nothing And ArrayChamp IsNot Nothing Then
     
                dansChamp = IsVisiblePointDansChamp(g, ArrayChamp, ptArbitraire)
     
                If dansChamp Then
                    MessageBox.Show(dansChamp.ToString())
                Else
                    MessageBox.Show("choisissez un autre point....")
                End If
            End If
        End Sub
     
        Public Function IsVisiblePointDansChamp(ByVal g As Graphics, ByVal ArrayChamp As Point(), ByVal ptTest As Point) As Boolean
     
            '1-Cree un GraphicsPath & lui ajoute  polygone Champ
            Dim myPath As New GraphicsPath
            myPath.AddPolygon(ArrayChamp)
     
            'ATTENTION OHJOE: IL N'EST PAS NECESSAIRE DE DESSINER
            'LE POLYGONE SUR PICTUREBOX.
            'TU PEUX ENLEVER CETTE LIGNE.C'EST JUSTE POUR ILLUSTRER LA METHODE
            'Dessine le path à l'ecran sur picturebox.
            Dim myPen As New Pen(Color.Black, 2)
            g.DrawPath(myPen, myPath)
     
            '2-Tester ptTest est "dans" polygone.
            Dim visible As Boolean = myPath.IsVisible(ptTest.X, ptTest.Y, g)
            MessageBox.Show(visible.ToString())
            Return visible
     
        End Function
     
     
     
     
    End Class
    Bonne recolte (il s'agit de quelles plantes la ?c'est pas des concombres j'espere......).
    bon code....................

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    :s le code que tu viens de me donner c'est du chinois

  14. #14
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut chinois en vb.net comme en c#
    bonjour ohjoe
    effectivement ca devient une ratatouille si tune sais entrer tes coordonnees gps dans un un tableau de point et en faire un polygone. Quant à parler du path c'est une autre discussion .......tres chinoise.....
    bon code......

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    le tableau de point est deja créé ... je ne comprends pas ce qu'est le path ...

    je dois tester si le point auquel je me trouve, est a l'intérieur du champ tracé au préalable selon une acquisition de donnée fait avant.

  16. #16
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut path egale un trace geometrique compose d'une succession de figures
    bonjour ohjoe
    bon comment expliquer un objet GraphicsPath?
    Supposons que tu as plusieurs lines en zigzag qui peuvent eventuellement se fermer sur eux-memes mais c'est des lignes "individualises"
    Tu veux faire une operation sur ces "lines" comme si elles etaient un seul objet c.à.d en "bloc",par exemple leur donner la meme couleur,la meme epaisseur .
    (Dans le cas ou ces "line" se referment ils formeront un polygone probablement quelconque et on voudrait le "filler" dans une couleur,savoir si un point est à l'interieur,intersecte).

    Eh bien le Path ou Trace en francais fait pour nous ce travail .On lui dit :
    -GraphicsPaths.addLine (il ajoute un "line" ) et ainsi de suite .
    -path.CloseFigure() .On lui dit de fermer le trace ce qui permet de former un polygone .
    Quand on a obtenu un tel Trace eh bien on peut lui fournir un point quelconque (dont tu as fais l'acquisition) et lui dire s'il est à l'interieur du Trace qu'on a construit ,à l'aide de la fonction GraphicsPath.IsVisible.

    Tu peux utiliser soit :
    -la methode ci-dessus GraphicPath.AddLine
    -soit la methode du tableau de point pour former un polygone et faire GraphicsPath.AddPolygone.

    Enfin le polygone me parait plus approprie ,parce que dans un autre post tu avais deja souleve la question et il m'a semble que tu stockais les sommets(points) de ton champ dans une liste.
    Comme une liste se transforme aisement en tableau,lequel se transforme aisement en polygone avec l'aide du Trace.
    voici un autre exemple code en c#:
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            //Cette liste tu l'a deja constitue dans  
            //un autre post
            List<Point> listeSommetsChamp=new List<Point>();
     
            //declare le tableau de points du champ
            Point[] ArrayChamp;
     
            //declare un Graphics
            Graphics g;
     
            //declare un Trace Geometrique 
            GraphicsPath TraceChamp ;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                //Initialise trace geometrique
                TraceChamp = new GraphicsPath();
     
                //Conversion en tableau à partir de ListeSommetsChamps
               ArrayChamp = listeSommetsChamp.ToArray();
     
     
               //Lui ajoute notre array champ
                TraceChamp.AddPolygon(ArrayChamp);
     
                //cree un objet graphics sur le pictureBoxChamp
                g =Graphics.FromHwnd(this.pictureBoxChamp.Handle);
     
            }
            //VARIANTE 1:le pictureBoxChamp  est capable de restituer une coordonnee en temps reel
            //dans le Mouse_Click tu clicque un point à tester pour verifier 
            //point est "visible" dans polygone champ (c'est une metaphore c.à.d s'il est à l'interieur du champ)
            private void pictureBoxChamp_MouseClick(object sender, MouseEventArgs e)
            {
                //click sur un point pour obtenir ses coordonnees "reelles"
                Point ptTestAcquis = e.Location;
     
                Boolean interieurChamp = TraceChamp.IsVisible(ptTestAcquis);
     
                if (interieurChamp)
                {
                    MessageBox.Show("point est à l'interieur");
     
                }
                else
                {
                    MessageBox.Show("point est à l'exterieur");
     
                }
     
            }
            //VARIANTE 2:le pictureBoxChamp  n'est pas pas capable de restituer une coordonnee en temps reel
            //Alors tu la recupere du GPS et tu fais le test
            private void button2_Click(object sender, EventArgs e)
            {
                //tu mets les coordonnees acquises du point à tester
                Point ptTestAcquis=new Point(0,0);
     
                Boolean interieurChamp = TraceChamp.IsVisible( ptTestAcquis);
     
                if (interieurChamp)
                {
                 MessageBox.Show ("point est à l'interieur");
     
                }
                else 
                {
                    MessageBox.Show("point est à l'exterieur");
     
                }
     
            }
        }
    }
    Les coordonnees des points du champ et celle du point à tester doivent etre exprimees dans le meme systeme d'unites(lat/long,mercator,lambert etc...).
    bon code.....

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    alors la , ton explication est simple clair net précise taillée sur mesure , j'aime.

    merci a toi je pense qu'elle me sera d'une grande utilité.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    je viens d'essayer mais rien ne s'affiche sur la picturebox ...

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 81
    Points : 37
    Points
    37
    Par défaut
    enfin si je fait ceci est ce que ca pourrait fonctionner pour l'affichage ert le test ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                          Graphics g = Graphics.FromHwnd(pictureBox.Handle);   //encapsulage d'une surface de dessin , mise en lien
                            //avec la picturebox
     
                            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //ligne de commande pour lisser la ligne
                            //graphique tracée  
                            greenpen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;      // ligne pour commander l'apparence de la ligne
                            pictureBox.Refresh();
                            // permet de convertir la list de points en tableau de point grâce au pen appelé greenpen
                            g.DrawPolygon(greenpen, affichage);    // la methode drawlines dessine un segment d'un tableau
                            g.Dispose();                      // pour ne pas occuper de la memoire pour rien.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/03/2004, 14h31
  2. [VMR9][D3D9]ecrire un texte sur une surface
    Par drizztfr dans le forum DirectX
    Réponses: 2
    Dernier message: 13/11/2003, 15h06
  3. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37
  4. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23
  5. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01

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