Arc de cercle

Signaler
-
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
-
Bonjour,

Je cherche le code pour tracer un arc de cercle avec vb.net 2010

27 réponses

Messages postés
29171
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 août 2020
335
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Merci de votre réponse
Je n'ai pas réussi à intégrer le code à mon appli
Je ne connais pas assez la programmation!
Bonjour Triangle

"Je suis un ancien charpentier, et j'écris un programme qui permet de trouver les coupes de charpente."

J en déduit donc que tu veux fabriquer des dessins pour le domaine du bois.
Mais ton but est il de fabriquer juste des coupes avec des cotes ou de visualiser l'objet ?

Car en ce domaine , il existe de multiples programmes gratuit pour fabriquer des objets 3D.

Précise ce que tu veux faire exactement et je pourrais peut être te donner des pistes a suivre.

Voici déjà une source qui peu te permettre de comprendre les prémices de l'affichage en matière de forme (en 3D mais facilement transposable en 2D).
http://codes-sources.commentcamarche.net/source/53580-matrice-de-rotation-quaternion-et-3d

Sachant qu'il y a beaucoup mieux en matière de gestion de l'affichage.
Bonne prog
CGSI3
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Bonjour CGSI3
Pour l'instant je compte faire des dessins en 2D, plus tard peut-être la 3D, mais comprendre la 2D l'appliquer à mon projet me prendra énormement de temps.
Il me manque des codes pour tracer
* des arcs de cercle avec des valeurs connues (l'axe, le rayon, l'angle de départ et l'angle d'arrivé) en pointillé, couleur
*Je cherche aussi à dessiner une ligne avec une orientation en degrés par rapport à une droite de référence, qui peut être une oblique (par exemple une perpendiculaire à partir d'une oblique)

J'ai sans doute du mal à me faire comprendre
Voir site


Merci de votre aide
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
Bonjour triangle29.

En vb 2010, les dessins utilisent la classe Graphics. Si comme je le crains cela ne vous dit rien, je vous conseille de bûcher le document de Philippe Lasserre disponible gratuitement sur le net.

Cordialement.
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Bonsoir Zermelo

Je fait déjà des dessins il me manque quelques modèles de code pour différentes formes ,à savoir arc de cercle avec secteur en degrés etc.

Je veux redessiner l'épure avec du code (voir en fin du manuel d'utilisation sur le site, lien ci dessous)
http://www.triangle29.com/modif-site-2013/pdf-2013.pdf

Exemple de code

'tracé de la baseAret
Dim Px1, Py1 As Integer
Px1 = Px
Py1 = Py
Dim tt1 As TraceTrait = New TraceTrait(Px1, Py1, CInt(Px1 + CInt(P_Baret * coef)), Py1, Pens.Black)
'tracé des saillies
Dim TraveG As TraceTrait = New TraceTrait(Px1, Py1, CInt(Px1 + CInt(P_DpG * coef)), Py1, Pens.Blue)
TraveG.Angle = P_DegresG
Dim TraveD As TraceTrait = New TraceTrait(Px1, Py1, CInt(Px1 + CInt(P_DpD * coef)), Py1, Pens.Blue)
TraveD.Angle = 360 - P_DegresD
'Tracé du chevron d'emprunt gauche
Dim Px2 As Integer
Px2 = CInt(Px + (P_Baret * coef))
Dim ChevEmpG As TraceTrait = New TraceTrait(Px2, Py1, CInt(Px2 + (P_baseG * coef)), Py1, Pens.Red)
ChevEmpG.Angle = 180 - (90 - P_DegresG)
'Tracé du chevron d'emprunt droit
Dim ChevEmpD As TraceTrait = New TraceTrait(Px2, Py1, CInt(Px2 + (P_baseD * coef)), Py1, Pens.Red)
ChevEmpD.Angle = 180 + (90 - P_DegresD)

Bonne soirée
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Bonsoir triangle,

Trouvé sur le net :
a mettre dans un module ..

Private Sub DrawACircle(ByRef g As Graphics, ByRef center As Point, ByVal radius As Integer)
' Select a pen object and make it red
Dim pn As New Pen(Color.Red)

' Create a bounding rectangle and make its center the center of our point
' Then make its width 2 * the radius
' Then draw our ellipse
Dim rect As New Rectangle(center.X / 2, center.Y / 2, radius * 2, radius * 2)
g.DrawEllipse(pn, rect)
End Sub

et tu l utilise comme ceci :

DrawCircle(e.Graphics, new Point(100,100), 50)


tu as aussi ceci pour les arc de cercle

http://msdn.microsoft.com/en-us/library/System.Drawing.Graphics_methods(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/ms142028(v=vs.110).aspx

Voici un exemple des possibilités de dessin : ( a mettre dans une form)

 Dim x As Integer = 10
Dim y As Integer = 10
Dim wid As Integer = 150
Dim hgt As Integer = 75
e.Graphics.SmoothingMode = _
Drawing2D.SmoothingMode.AntiAlias
e.Graphics.DrawRectangle(Pens.Black, x, y, wid, hgt)
y += hgt + 10
e.Graphics.DrawEllipse(Pens.Black, x, y, wid, hgt)
y += hgt + 10
e.Graphics.DrawLine(Pens.Black, x, y, x + wid, y + hgt)

y = 10
x += wid + 10
e.Graphics.DrawArc(Pens.Black, x, y, wid, hgt, -30, 270)
y += hgt + 10
e.Graphics.DrawPie(Pens.Black, x, y, wid, hgt, -30, 270)
y += hgt + 10

Dim big_font As New Font("Comic Sans MS", 60, _
FontStyle.Bold, GraphicsUnit.Pixel)
e.Graphics.TextRenderingHint = _
TextRenderingHint.AntiAliasGridFit
e.Graphics.DrawString("Hello!", big_font, _
Brushes.Black, x, y)


Je n ai pas trop le temps de me lancer en ce moment dans des essais géométriques, mais en théorie si tu veux fabriquer toi meme les fonctions, pour dessiner un arc de cercle, tu peux t inspirer de ce genre de figure http://fr.wikipedia.org/wiki/Dod%C3%A9cagone

Un cercle, ou arc de cercle, c est une multitude de segment droit donc a ce niveau tu trace par exemple 36 traits éloignés de 10° et tu as presque un cercle, tu divise encore si l aspect ne te parait pas parfait.
Cela peut se fabriquer dans une fonction, voir mieux dans une class.
Ce code ressemblerait a cela, a toi de définir l'arrêt et le départ de la boucle "for num"


Dim centreX As Double = 10
Dim centreY As Double = 20
Dim apen As New Pen(Color.White, 1)
Dim radius As Double = 60
Const Pi As Double = Math.PI
Dim x1, y1 As Integer
For num As Double = 0 To 2 * Pi Step 0.01
x1 = Convert.ToInt32(radius * Math.Cos(num) + centreX)
y1 = Convert.ToInt32(radius * Math.Sin(num) + centreY)
e.Graphics.DrawLine(apen, x1, y1, x1 + 1, y1)
Next

Bonne Prog
CGSI3
--
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Bonjour CGSI3
Merci pour ton aide, je n'ai pas encore réussi à intégrer le code dans mon application, je vais faire des essais.
J'ai déjà le code pour tracer un cercle
Bonne journée
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Rebonjour CGSI3

J'ai essayer d'intégrer le code (arc de cercle)
e.Graphics n'est pas reconnu par l'appli

"J'ai fait une copie du code pour tracer un cercle, qui fonctionne dans mon appli "

#Region " Tracé "
Private Sub BoutonTracer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonTracer.Click
Me.TraceTest.Show()

' --- tracé : un cercle
Dim tc1 As TraceCercle = New TraceCercle(400, 300, 200, Pens.Navy)

With Me.TraceTest
.StockerTrace(tc1)

End With

End Sub

#End Region

Par avance merci
Messages postés
14584
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
8 août 2020
426
Voir ici comment utiliser la coloration syntaxique.
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Bonjour Triangle29,

Pour utiliser l'outil Graphics il faut vérifier que la référence a l'objet System.Drawing soit bien activé.
Regarde sur google " Ajouter une référence a un projet"

Ensuite vérifier l'import en début de module comme tout objet

' En début de Module ou de Class
Option Explicit On

Imports System.Drawing

' Ensuite par exemple pour une fenêtre Form avec un Button

Public Class Form1
    Public G As Graphics
' ou
    Public G As System.Drawing.Graphics ' (c est la même chose)

Public Sub New()
        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        G = Me.CreateGraphics 'Pour un formulaire
        Me.DoubleBuffered = True
        Me.WindowState = FormWindowState.Maximized
end sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         Affiche_Exemple(G)
    End Sub
.....
etc



Cela donne pour la fonction Affiche_Exemple appelé:

Option Explicit On

Imports System.Drawing

Module Module1

Public Sub Affiche_Exemple(ByRef G As System.Drawing.Graphics)
    Dim x As Integer = 10
    Dim y As Integer = 10
    Dim wid As Integer = 150
    Dim hgt As Integer = 75
    G.SmoothingMode = _
        Drawing2D.SmoothingMode.AntiAlias
    G.DrawRectangle(Pens.Black, x, y, wid, hgt)
    y += hgt + 10
    G.DrawEllipse(Pens.Black, x, y, wid, hgt)
    y += hgt + 10
    G.DrawLine(Pens.Black, x, y, x + wid, y + hgt)

    y = 10
    x += wid + 10
    G.DrawArc(Pens.Black, x, y, wid, hgt, -30, 270)
    y += hgt + 10
    G.DrawPie(Pens.Black, x, y, wid, hgt, -30, 270)
    y += hgt + 10

    Dim big_font As New Font("Comic Sans MS", 60, _
        FontStyle.Bold, GraphicsUnit.Pixel)
    G.TextRenderingHint = _
        TextRenderingHint.AntiAliasGridFit
    G.DrawString("Hello!", big_font, _
        Brushes.Black, x, y)
end Sub

End Module


NB: j ai déclaré G en public, cela doit normalement permettre d'éviter de le passer en paramètre => a voir

N'ayant pas le temps, j ai fais cela a la volée , je vérifierai ce soir, mais il est indispensable que tu puisse au moins utiliser l'objet Graphics pour afficher tes formes.

Sachant ensuite que le mieux en matière de graphisme c'est de passer par OpenTk , DirectX ou mieux : le WPF et donc la carte graphique .. mais cela n'est valable que pour la 3D ...

Donc si je peux te donner un conseil, essaye de conçevoir ton application d'une manière a pouvoir la faire évoluer sans tout devoir refaire si tu veux appréhender ensuite des outils plus efficaces (mais également bcp + complex).

Bonne Prog
CGSI3
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Tu trouveras ci dessous le code que j'ai coller à mon projet


Option Explicit On

Imports System.Drawing
Public Class DemoTraces
' Document à imprimer
Private WithEvents _doc As New Printing.PrintDocument

' Fenêtres d'aperçu avant impression et de choix d'imprimante
Private WithEvents _prv As New PrintPreviewDialog()
Private _parametresImpression As Printing.PrinterSettings


#Region " Tracé "

Private Sub ButtonTracer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonTracer.Click
Me.TraceTest.Show()
' --- tracé : un cercle
Dim tc1 As TraceCercle = New TraceCercle(400, 300, 200, Pens.LightGray)
With Me.TraceTest
.StockerTrace(tc1)
End With
End Sub

Public Sub ButtonTracer_Click(ByRef G As System.Drawing.Graphics)
Dim x As Integer = 10
Dim y As Integer = 10
Dim wid As Integer = 150
Dim hgt As Integer = 75
G.SmoothingMode = _
Drawing2D.SmoothingMode.AntiAlias
G.DrawRectangle(Pens.Black, x, y, wid, hgt)
y += hgt + 10
G.DrawEllipse(Pens.Black, x, y, wid, hgt)
y += hgt + 10
G.DrawLine(Pens.Black, x, y, x + wid, y + hgt)

y = 10
x += wid + 10
G.DrawArc(Pens.Black, x, y, wid, hgt, -30, 270)
y += hgt + 10
G.DrawPie(Pens.Black, x, y, wid, hgt, -30, 270)
y += hgt + 10

Dim big_font As New Font("Comic Sans MS", 60, _
FontStyle.Bold, GraphicsUnit.Pixel)
'G.TextRenderingHint = _
'TextRenderingHint.AntiAliasGridFit()
'G.DrawString("Hello!", big_font, _
'Brushes.Black, x, y)
End Sub

#End Region


Seul le dessin du cercle fonctionne, j'ai dû mettre en commentaire G.TextRenderingHint car j'avais un message d'erreur.
Comment intégrer le code au ButtonTracer_Click existant

x = position horizontale
y = position verticale
Wid = ?
hgt = ?
Est-ce que l'angle de l'arc de cercle est défini ci dessus

Je ne veux prendre trop de ton temps

A bientôt Pierrick
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Re Triangle29

J'essaie de comprendre avec ce bout de code ou tu en est.

DemoTraces est une form?

Si c est le cas,

la fonction
Private Sub ButtonTracer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonTracer.Clic

sera déclenché par l'appui sur le button Buttontracer

ensuite a quoi correspond cette seconde ligne ??

Public Sub ButtonTracer_Click(ByRef G As System.Drawing.Graphics)

elle n'est associé a rien je pense car difficile de faire une seconde sub avec le même nom ("ButtonTracer_Click") surtout que le terme "Handles BoutonTracer.Clic" est indispensable pour associer le bouton a l'évenement "Click" du bouton

place ce bout de code a la place de celui que tu m'a laissé en faisant attention de ne pas effacer celui que tu as écrit pour le récupérer et dis moi si ca marche


Option Explicit On

Imports System.Drawing
Public Class DemoTraces
    ' Document à imprimer
    Private WithEvents _doc As New Printing.PrintDocument

    ' Fenêtres d'aperçu avant impression et de choix d'imprimante
    Private WithEvents _prv As New PrintPreviewDialog()
    Private _parametresImpression As Printing.PrinterSettings

   Public G As System.Drawing.Graphics

   Public Sub New()
        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel   InitializeComponent().
        G = Me.CreateGraphics 'Pour un formulaire
        Me.DoubleBuffered = True
        Me.WindowState = FormWindowState.Maximized
   end sub


#Region " Tracé "
    
    Private Sub ButtonTracer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonTracer.Click

        Me.TraceTest.Show()
        ' --- tracé : un cercle
        Dim tc1 As TraceCercle = New TraceCercle(400, 300, 200, Pens.LightGray)
        With Me.TraceTest
            .StockerTrace(tc1)
        End With

        Affiche_Exemple(G)
    End Sub

 Public Sub Affiche_Exemple(ByRef G As System.Drawing.Graphics)
    Dim x As Integer = 10
    Dim y As Integer = 10
    Dim wid As Integer = 150
    Dim hgt As Integer = 75
    G.SmoothingMode = _
        Drawing2D.SmoothingMode.AntiAlias
    G.DrawRectangle(Pens.Black, x, y, wid, hgt)
    y += hgt + 10
    G.DrawEllipse(Pens.Black, x, y, wid, hgt)
    y += hgt + 10
    G.DrawLine(Pens.Black, x, y, x + wid, y + hgt)

    y = 10
    x += wid + 10
    G.DrawArc(Pens.Black, x, y, wid, hgt, -30, 270)
    y += hgt + 10
    G.DrawPie(Pens.Black, x, y, wid, hgt, -30, 270)
    y += hgt + 10

    Dim big_font As New Font("Comic Sans MS", 60, _
        FontStyle.Bold, GraphicsUnit.Pixel)
    G.TextRenderingHint = _
        TextRenderingHint.AntiAliasGridFit
    G.DrawString("Hello!", big_font, _
        Brushes.Black, x, y)
end Sub

#End Region
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
Bonsoir triangle29.

Ce tout petit bout de code vous sera-t-il utile ?

Imports System.Drawing
Public Class Accueil
Private g As Graphics

Private Sub Accueil_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
g = e.Graphics
g.DrawArc(Pens.Black, 10, 10, 100, 100, 0, 90)
End Sub

End Class


Cordialement.
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
OK ça marche, le tracé se fait en dehors de la zone de dessin, je devrais pouvoir résoudre vle problème.


Je regarde l'angle de l'arc de cercle
wid = largeur
hgt = hauteur de l'arc

Dim big_font As New Font("Comic Sans MS", 60, _
FontStyle.Bold, GraphicsUnit.Pixel)
G.TextRenderingHint = _
TextRenderingHint.AntiAliasGridFit()
G.DrawString("Hello!", big_font, _
Brushes.Black, x, y)

Derrière TextRenderingHint, il y a une message d'erreur ' n'est pas déclaré'

Voir arc de cercle en pointillé

Merci
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
Re.

Importez donc la classe
System.Drawing.Text
, juste pour rire.
Pour faire des pointillés, voyez la classe
Pen
.
Et de grâce, servez-vous de votre explorateur d'objets (F2).

Bonne nuit.
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Bonjour CGSI3 et Semelo

DemoTrace est bien une Form

TraceTest est la zone de dessin

Je n'arrive pas à StockerTrace ( ) G.DrawRetangle dans TraceTest, ce n'ai pas le même type de dessin ?

#Region " Tracé "

Private Sub ButtonTracer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonTracer.Click
Me.TraceTest.Show()
' --- tracé : un cercle
Dim tc1 As TraceCercle = New TraceCercle(400, 300, 200, Pens.LightGray)

Affiche_Exemple(G)

Dim x As Integer = 10
Dim y As Integer = 10
Dim wid As Integer = 100
Dim hgt As Integer = 150
G.SmoothingMode = _
Drawing2D.SmoothingMode.AntiAlias
G.DrawRectangle(Pens.Black, x, y + 500, wid, hgt)
y += hgt + 10

With Me.TraceTest
.StockerTrace(tc1)

End With

End Sub

J'ai intégré "Imports System.Drawing.Text en haut de l'écran, mais TextRenderingHing à toujours un message d'erreur
C'est moins important car je peux déjà mettre du texte dans la zone de dessin

'Dim big_font As New Font("Comic Sans MS", 60, _
'FontStyle.Bold, GraphicsUnit.Pixel)
'G.TextRenderingHint = _
'TextRenderingHint.AntiAliasGridFit()
'G.DrawString("Hello!", big_font, _
'Brushes.Black, x, y)

La classe Pen ne gère pas que les couleurs?

A bientôt
Pierrick
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
Bonjour triange29

J'ai testé le programme suivant, ce qui n'a provoqué aucun message d'erreur. Le plus fort, c'est que cela fonctionne encore sans l'import de Imports System.Drawing.Text.

Imports System.Drawing
Imports System.Drawing.Text
Public Class Accueil
Private g As Graphics

Private Sub Accueil_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
g = e.Graphics
g.DrawArc(Pens.Black, 10, 10, 100, 100, 0, 90)
g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
End Sub

End Class
Public Class Accueil
Private g As Graphics

Private Sub Accueil_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
g = e.Graphics
g.DrawArc(Pens.Black, 10, 10, 100, 100, 0, 90)
g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
End Sub

End Class


D'autre part, sachez que non, la classe Pen ne se limite pas à la couleur du crayon. Je n'avais jamais utilisé les pointillés en vb.net, mais j'ai cherché dans l'explorateur d'objets, et j'ai trouvé. Pourquoi ne feriez-vous pas de même ?

Cordialement.
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Bonjour Zermelo
J'ai réussi a copier ton code celà fonctionne sur une form vierge nommée Accueil, moi il faut que je l'intègre à mon appli, dans la zone de dessin appeler TraceTest

With Me.TraceTest
.StockerTrace(tc1)

End With

Je ne trouve pas l'explorateur d'objets

Pourquoi as tu copier le même code 2 fois

Merci
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
Re.

J'ai copié le code deux fois parce que j'étais mal réveillé.
L'explorateur d'objets apparaît lorsque l'on tape sur la touche F2.
J'ignore tout des zones de dessin en vb 2010. Je vais voir.

Cordialement.
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
13
Je n'ai rien trouvé sur les zones de dessin en vb.net. Pour éclairer ma lanterne, pouvez-vous me dire comment l'objet
TraceTest
a été créé, et quel est son type. Ne serait-ce pas un contrôle
PictureBox
?
Messages postés
13
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
4 avril 2014
1
Bonne nuit Zermelo
TraceTest est le nom d'un calque, c'est un informaticien qui m'a fait des exemple de code pour les différents tracés géométrique, ce n'est pas une PictureBox ! je ne saurai pas vous renseignez plus précisément.
Demain je ne pourrai pas vous répondre
A bientôt