none
TROUVER LA LONGUEUR EN PIXEL D UN TRAIT OU D UNE COURBE RRS feed

  • Question

  • Bonjour à tous

    Quelle serait la ou les commandes pour

    tracer sur l'écran un trait ou une courbe et en connaitre au fure et à mesure de l'avancement , sa longeur en pixels ?

    Merci

    Cordialement

    Eric 

    vendredi 11 mai 2012 09:19

Réponses

  • Bonjour Aumeric,

    Voici les calculs de base (qui peuvent sans doute être améliorés par les matheux)...

    Si tu veux un marquage constant de la taille, il faut toujours tracer en boucle, comme dans le cercle ci-dessous et donc faire le calcul de la taille dans la boucle ; pour ma part je ne vois pas l'utilité de ce calcul permanent, car ça va si vite que tu n'arriveras jamais à le lire... Testé, à copier-coller dans une form nouvelle, code :

    Option Explicit On
    Public Class Form1
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.White
        Me.Left = 0
        Me.Top = Me.Left
        Me.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
        Me.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
      End Sub
    
      Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Dim x1, x2, y1, y2, lgr As Integer ' LIGNE
        Dim c As New Pen(Color.FromArgb(255, 0, 0), 5) ' RGB + épaisseur trait
        Dim g As System.Drawing.Graphics = Me.CreateGraphics()
        Dim f1 As New Font("Times New Roman", 18, FontStyle.Regular, GraphicsUnit.Pixel)
        x1 = 10 ' exemple
        y1 = 20
        x2 = 200
        y2 = 50
        ' pour la racine carré d'un rectangle x2 => x1 et y2 => y1, sinon on modifie le calcul
        lgr = System.Math.Sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2)) ' diagonale d'un rectangle
        g.DrawLine(c, x1, y1, x2, y2)
        g.DrawString("Taille = " & lgr & " pixels", f1, New SolidBrush(Color.Black), x2 + 10, y2 - 10)
        '
        '
        Dim r As Long = 50 ' ARC
        Dim ox As Long = 50 ' centre
        Dim oy As Long = 200
        Dim ar As Double ' angle en radians
        Dim i As Double
        Dim sinus As Double
        Dim cosinus As Double
        Dim x As Long
        Dim y As Long
        Dim xy As New Bitmap(1, 1) ' pixel de traçage
        Dim maxi As Integer = 105
        For r = 46 To 50
          For i = 0 To maxi Step 0.1
            ar = i * 3.14 / 180
            cosinus = Math.Cos(ar)
            sinus = Math.Sin(ar)
            x = r * cosinus + ox
            y = oy - r * sinus
            xy.SetPixel(0, 0, Color.Blue)
            g.DrawImage(xy, New Point(x, y))
          Next i
        Next r
        lgr = (r + r) * (System.Math.PI / 360 * Maxi)
        g.DrawString("Taille = " & lgr & " pixels", f1, New SolidBrush(Color.Black), ox + r + 20, oy - 10)
        g.Dispose()
      End Sub
    End Class

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    vendredi 11 mai 2012 18:46

Toutes les réponses

  • Bonjour Aumeric,

    Voici les calculs de base (qui peuvent sans doute être améliorés par les matheux)...

    Si tu veux un marquage constant de la taille, il faut toujours tracer en boucle, comme dans le cercle ci-dessous et donc faire le calcul de la taille dans la boucle ; pour ma part je ne vois pas l'utilité de ce calcul permanent, car ça va si vite que tu n'arriveras jamais à le lire... Testé, à copier-coller dans une form nouvelle, code :

    Option Explicit On
    Public Class Form1
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.BackColor = Color.White
        Me.Left = 0
        Me.Top = Me.Left
        Me.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
        Me.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
      End Sub
    
      Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Dim x1, x2, y1, y2, lgr As Integer ' LIGNE
        Dim c As New Pen(Color.FromArgb(255, 0, 0), 5) ' RGB + épaisseur trait
        Dim g As System.Drawing.Graphics = Me.CreateGraphics()
        Dim f1 As New Font("Times New Roman", 18, FontStyle.Regular, GraphicsUnit.Pixel)
        x1 = 10 ' exemple
        y1 = 20
        x2 = 200
        y2 = 50
        ' pour la racine carré d'un rectangle x2 => x1 et y2 => y1, sinon on modifie le calcul
        lgr = System.Math.Sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2)) ' diagonale d'un rectangle
        g.DrawLine(c, x1, y1, x2, y2)
        g.DrawString("Taille = " & lgr & " pixels", f1, New SolidBrush(Color.Black), x2 + 10, y2 - 10)
        '
        '
        Dim r As Long = 50 ' ARC
        Dim ox As Long = 50 ' centre
        Dim oy As Long = 200
        Dim ar As Double ' angle en radians
        Dim i As Double
        Dim sinus As Double
        Dim cosinus As Double
        Dim x As Long
        Dim y As Long
        Dim xy As New Bitmap(1, 1) ' pixel de traçage
        Dim maxi As Integer = 105
        For r = 46 To 50
          For i = 0 To maxi Step 0.1
            ar = i * 3.14 / 180
            cosinus = Math.Cos(ar)
            sinus = Math.Sin(ar)
            x = r * cosinus + ox
            y = oy - r * sinus
            xy.SetPixel(0, 0, Color.Blue)
            g.DrawImage(xy, New Point(x, y))
          Next i
        Next r
        lgr = (r + r) * (System.Math.PI / 360 * Maxi)
        g.DrawString("Taille = " & lgr & " pixels", f1, New SolidBrush(Color.Black), ox + r + 20, oy - 10)
        g.Dispose()
      End Sub
    End Class

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    vendredi 11 mai 2012 18:46
  • Merci, je vais tester.

    Ce que je voudrais faire c'est une courbe tracée à la souris et connaitre le nombre de pixels de cette courbe qui n'est pas forcément régulière

    merci en tout cas

    Cordialement

    Eric

    mardi 15 mai 2012 08:07
  • Bonjour Aumeric,

    Alors si tu es satisfait de mes réponses tu peux cliquer en haut à gauche de chaque réponse sur le rectanglee où siège le petit trianglee vert (pour mon avancement :o) ...

    Sinon, déjà il faudrait savoir si tu veux le nombre de pixel écrits ou le nombre de pixels en dimension occupée, en effet, selon les figures, notamment les lignes courbes, il y aura plus de pixels écrits que de pixeels en dimeension (pixels écrits, on compte chaque pixel, tandis quee pixels en dimeension occupée, on inscrit la figure dans un rectangle et on prend sa diagonale) ?

    Concernant le dessin à la souris, ben c'est pareil, on prend en sus les évèneements de la souris (down) et tant que (down) ben on récupère les positions XY selon lees besoins, puis au (up) de la souris on calcule, comme je l'ai fait, et on a un résultat identique.

    Si tu veux que je te fasse un exemple, indique déjà si tu veux lee nombre dee pixels réel ou le nombre de pixeels occupés (quand il y a une différence), et pose une nouvelle question du genre : "Calculer les pixels dessinés par la souris", et envoies moi un mail (voir mon enpieed à la fin de ce message), afin de me dire que tu veins dee poser ta question, que j'y retourne.

    Touteefois, ceci est tout reelatif car si jamais tu fais un faux mouvement de traçage, ça va être compté dans les pixels tracés alors que tu ne le voudras sans doutee pas. Pour y remédieer il faudra fairee intervenir la couleeur de traçage par rapport à la couleeur de fond, et compter les pixels d'une couleur x, donc il te faut un fond uni, sinon on ne va pas y arriver...

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    mardi 15 mai 2012 08:32
  • c'est plutot le nombre de pixel occupé

    L'idée, c'est de mettre cela sur une carte et de tracer  un bout de route, et d'en  extrapoler le nombre de mètres tracés entre tel et tel point et bien sur pas en ligne droite mais en suivant la route qui peut faire plusieurs courbes

    Merci en tout cas

    Cordialement

    Eric

    samedi 19 mai 2012 19:50
  • Bonjour,

    Ah, tu veux faire un curvimètre, ben c'est en fait plus simple que ta question, il n'y a pas de courbe, il y a qu'une sucession de lignes droites dont on additionne les pixels (vois par exemple Google terre avec son curvimètre).

    On gère par exemple au clique droit les éléments (début, effacer tout, effacer dernier tracé, en registrer, etc.)... puis au bouton gauche on trace, à un changement de direction on lâche puis on reprend son tracé, et tout au long on additionne les pixels, dont on aura donné une échelle pour en faire des mètres ; ce qui implique de mettre la carte à l'échelle dans l'application préalablement.

    Donc ce n'est ps le nombre de pixels occupés mais "parcourus".

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    dimanche 20 mai 2012 07:41
  • oui c'est ce que je voudrais faire

    cordialement

    Eric

    dimanche 20 mai 2012 08:15
  • Eric,

    Et alors, tu as assez de réponse pour le faire ?

    D'abord coller une image, la mettre à une dimension qui tienne dans l'écran, calculer son échelle 1cm/x, ensuite il faut trouver la taille du pixel selon lécran ; et dan un second temps gérer le traçage en mémorisant ce qu'il y a dessous afin de pouvoir le restituer, etc.

    Difficulté 3,5 / 5

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    dimanche 20 mai 2012 09:26
  • Joseph,

    j'arrive à desinner plusieurs ligne droites en fonction des clic de souris, mais je n'arrive pas à le faire sur toute la form.

    Les traits apparaissent uniquement sur le quart supérieure gauche de l'écran .

    voici mon code

    Imports

    System.Drawing

    Public

    Class Form1

    Public g As System.Drawing.Graphics = Me.CreateGraphics()

    Public vieuxx As Integer, vieuxy As Integer

     

    Private Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

    If vieuxx = 0 AndAlso vieuxy = 0 Then

    vieuxx = e.X

    vieuxy = e.Y

    End If

    If e.Button = Windows.Forms.MouseButtons.Left Then

    g.DrawLine(

    SystemPens.ControlDarkDark, vieuxx, vieuxy, e.X, e.Y)

    vieuxx = e.X

    vieuxy = e.Y

    End If

    End Sub

     

     

    End

    Class

    cordialement eric

    lundi 21 mai 2012 06:14
  • Bonjour Eric,

    Ceci :

    Option Explicit On
    Public Class Form1
      Public g As System.Drawing.Graphics = Me.CreateGraphics()
      Public ancienX, ancienY As Integer
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ancienX = 0
        ancienY = 0
      End Sub
    
      Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If ancienX = 0 And ancienY = 0 Then
          ancienX = e.X
          ancienY = e.Y
        End If
        If e.Button = Windows.Forms.MouseButtons.Left Then
          g.DrawLine(SystemPens.ControlDarkDark, ancienX, ancienY, e.X, e.Y)
          ancienX = e.X
          ancieny = e.Y
        End If
      End Sub
    
      Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        g.Dispose()
      End Sub
    End Class

    J'ai changé vieux, car se terminant par un x c'était pas joyeux en "vieuxx".

    Il faut faire disposer l'objet.

    J'ai enlevé l'entête importé car tu réécris cette dernière dans ton code, alors c'est l'un ou l'autre.

    AndAlso, je connais mal, j'ai mis and (andAlso n'examine pas la suite si le début n'est pas conforme, bof, une variante du And..

    *

    Sans doute faut-il rafraîchir dans une procédure de dessins, je vais voir, mais je maîtrise mal l'objet graphique, en tout cas je n'aurais pas fait ainsi, car le principe du curvimètre n'es pas de tracer de lignes après coup, mais de tracer en continu.

    A bientôt, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 21 mai 2012 08:44
  • Eric, suite :

    Option Explicit On
    Public Class Form1
      Dim g As System.Drawing.Graphics = Me.CreateGraphics()
      Dim noir As New Pen(Color.FromArgb(0, 0, 0), 2)
      Dim x1, x2, y1, y2 As Integer
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        x1 = 0
        x2 = 0
        y1 = 0
        y2 = 0
      End Sub
    
      Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If e.Button <> Windows.Forms.MouseButtons.Left Then Exit Sub
        If x1 = 0 And y1 = 0 Then ' début
          x1 = e.X
          y1 = e.Y
          g.DrawLine(noir, x1 - 1, y1 - 1, x1 + 1, y1 + 1)
          Exit Sub
        End If
        x2 = e.X
        y2 = e.Y
        g.DrawLine(noir, x1, y1, x2, y2)
        x1 = x2
        y1 = y2
        x2 = 0
        y2 = 0
      End Sub
    
      Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        g.Dispose()
      End Sub
    
    End Class

    J'ai le même problème de limite du traçage, sans doute faut-il déclarer une zone préalablement, peut être avec <BipMap> ? Travailler au point (xy1, xy2) ? Et penser à rafraîchir si ton dessin est masqué par quoi que ce soit...

    En résumé, je ne sais pas :o)

    Mieux vaut reposer la question du genre "Comment pouvoir dessiner sur toute la form ?"

    Sinon, ensuite, il faudra faire une matrice m(x, y, c) de la taille de l'écran pour mémoriser la couleur des pixels sous le traçage des lignes, ce qui sans doute implique un primo traçage à vide de lecture de ta ligne pour la mémoriser en couleur et position, puis en secondo traçage écrire la vraie ligne. Là non plus je ne sais pas le faire avec certitude, tout le problème étant d'arriver à suivre exatement la ligne afin de récupérer les couleurs.

    En vb6 c'est assez simple à faire, mais en vbNet c'est bien plus complexe, il faut sans cesse déclarer plein d'objet...

    Il y a des gens calés dans ce domaine ici.

    @+, désolé, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Proposé comme réponse EhJoe lundi 21 mai 2012 09:31
    lundi 21 mai 2012 09:31