Meilleur auteur de réponses
TROUVER LA LONGUEUR EN PIXEL D UN TRAIT OU D UNE COURBE

Question
-
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
- Proposé comme réponse Gilles TOURREAUModerator samedi 12 mai 2012 08:18
- Modifié EhJoe samedi 12 mai 2012 08:29 correction
- Marqué comme réponse Ciprian Duduiala lundi 14 mai 2012 07:04
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
- Proposé comme réponse Gilles TOURREAUModerator samedi 12 mai 2012 08:18
- Modifié EhJoe samedi 12 mai 2012 08:29 correction
- Marqué comme réponse Ciprian Duduiala lundi 14 mai 2012 07:04
-
-
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 -
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
-
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 -
-
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 -
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
-
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 -
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