Arc de cercle

triangle29 - 26 mars 2014 à 10:12
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - 4 avril 2014 à 08:20
Bonjour,

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

27 réponses

Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
30 mars 2014 à 10:23
Bonjour triangle29.

La zone de dessin s'est transformée en calque. Diafoirus est passé par là.
Blague à part, je voudrais connaître le type de l'objet
Me.TraceTest
. Dans ce but, je vous demande de mettre provisoirement dans votre code
MessageBox.Show(Me.TraceText.GetType.ToString)

À lundi.
0
triangle29 Messages postés 13 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 4 avril 2014 1
1 avril 2014 à 19:56
Bonsoir Zermelo et CGSI3
Excuzez moi pour avoir tardé à vous répondre.
Le type de "l'objet" a dû être créé par le concepteur de l'application, a qui j'avais fait appel pour mon projet de logiciel de charpente.
Il m'avait préparé une structure de code pour faire des tableaux avec les calculs que je lui transmettait.
La partie dessin lui aurai demandé trop de temps et le suivi technique aurai été compliqué pour lui, car il faut connaitre en charpente faire ce que je lui demandai.
Il m'a préparé un modèle pour tracer des formes géométriques, pour que je puisse me débrouillé tout seul pour compléter mon appli avec des dessins de charpente, ce que j'ai fait en partie.
Il me manque le code pour tracer des arcs de cercle, d'ou l'ojet de ma demande.
Si je trouve comment adapté votre code, qui semble t'il ne fait pas appel au même objet, je vous tiendrai au courant.

Encore merci pour votre aide

Copie du code pour tracer un cercle, comment faire pour un arc de cercle ?


Public Class TraceCercle
Inherits TraceBase

Protected _x As Integer
Protected _y As Integer
Protected _rayon As Integer
Protected _rectangle As Rectangle

#Region " Constructeurs "
' Constructeur de base
' Le contour du cercle hérite de celui défini dans la classe de base (donc noir)
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal rayon As Integer)
Me._x = x
Me._y = y
Me._rayon = rayon
Me.CalculerRectangle()
End Sub

' Constructeur de base avec le stylo en supplément
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal rayon As Integer, ByVal stylo As Pen)
Me.New(x, y, rayon)
Me.StyloTrace = stylo
End Sub

' Constructeur avec brosse pour le remplissage
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal rayon As Integer, ByVal brosse As Brush)
Me.New(x, y, rayon)
Me.BrosseFond = brosse
End Sub

' Constructeur avec stylo pour le contour et brosse pour le remplissage
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal rayon As Integer, ByVal stylo As Pen, ByVal brosse As Brush)
Me.New(x, y, rayon, stylo)
Me.BrosseFond = brosse
End Sub
#End Region

#Region " Propriétés "
' Abscisse du centre
Public Property X() As Integer
Get
Return Me._x
End Get
Set(ByVal value As Integer)
Me._x = value
Me.CalculerRectangle()
End Set
End Property

' Ordonnée du centre
Public Property Y() As Integer
Get
Return Me._y
End Get
Set(ByVal value As Integer)
Me._y = value
Me.CalculerRectangle()
End Set
End Property

' Rayon du cercle
Public Property Rayon() As Integer
Get
Return Me._rayon
End Get
Set(ByVal value As Integer)
Me._rayon = value
Me.CalculerRectangle()
End Set
End Property

' Rectangle entourant le cercle
Public ReadOnly Property RectangleCirconscrit() As Rectangle
Get
Return Me._rectangle
End Get
End Property
#End Region

#Region " Méthodes "
' Mise à jour de la taille du rectangle circonscrit au cercle
Protected Sub CalculerRectangle()
Me._rectangle = New Rectangle(Me.X - Me.Rayon, Me.Y - Me.Rayon, Rayon * 2, Rayon * 2)
End Sub

' Tracé du cercle
Public Overrides Sub Tracer(ByVal g As System.Drawing.Graphics)
Dim rct As New Rectangle(Me._rectangle.Location, Me._rectangle.Size)
Dim mtx As Drawing2D.Matrix = Nothing

' Transformations
If Me.Angle <> 0 Then
mtx = g.Transform
g.TranslateTransform(Me._rectangle.X, Me._rectangle.Y)
g.RotateTransform(Me._angle)

' Corriger le rectangle de départ
rct.X = 0
rct.Y = 0
End If

' Tracer le fond s'il est défini
If Me.BrosseFond IsNot Nothing Then
g.FillEllipse(Me.BrosseFond, rct)
End If

' Tracer le contour s'il est défini
If Me.StyloActif IsNot Nothing Then
g.DrawEllipse(Me.StyloActif, rct)
End If

' Annuler les transformations
If Me.Angle <> 0 Then
g.Transform = mtx
End If
End Sub
#End Region
End Class
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
2 avril 2014 à 08:24
Bonjour triangle29.

Votre code, pour un cercle, est bien trop compliqué. D'autre part, vous n'avez pas fait le test que je vous avais demandé. Ces deux raisons font que je préfère me retirer de cette discussion.

Désolé.
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
3 avril 2014 à 22:45
Bonjour triangle29.

J'ai passé 1 h sur ton truc et cela donne ce bout de code
Au passage la class TraceBase n'est pas décrite. Elle doit ressembler a ceci

ublic MustInherit Class TraceBase
    Public _angle As Double
    Public StyloTrace As System.Drawing.Pen
    Public BrosseFond As System.Drawing.Brush
    'Le mot clé MustOverride signifie que cette méthode doit être écrasée dans les classes dérivées
    Public MustOverride Sub Tracer(ByVal g As System.Drawing.Graphics)
End Class


Sachant que pour ce soir je n'ai pas réussi a colorier l'intérieur de l'arc de cercle (tracer le fond)
J'ai aussi remarqué quelques petits truc sur ton code Tracecercle mais j'attend le code de Tracebase pour confirmer.
Je te laisse a modifier les commentaires de Cercle en => Arc de Cercle dans le code.

Les angles de départ et de fin sont exprimés en degrés

startAngle
Type : System.Single
Angle, mesuré en degrés dans le sens horaire, à partir de l'axe x jusqu'au point de départ de l'arc.

FinAngle
Type : System.Single
Angle, mesuré en degrés dans le sens horaire, à partir du paramètre startAngle jusqu'au point d'arrivée de l'arc.


Public Class TraceArcCercle
    Inherits TraceBase

    Protected _x As Integer
    Protected _y As Integer
    Protected _AngDep As Single
    Protected _AngFin As Single
    Protected _rayon As Integer
    Protected _rectangle As Rectangle

#Region " Constructeurs "
    ' Constructeur de base
    ' Le contour du cercle hérite de celui défini dans la classe de base (donc noir)
    Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer)
        Me._x = x
        Me._y = y
        Me._AngDep = AngleDep
        Me._AngFin = AngleFin
        Me._rayon = rayon
        Me.CalculerRectangle()
    End Sub

    ' Constructeur de base avec le stylo en supplément
    Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal stylo As Pen)
        Me.New(x, y, rayon, AngleDep, AngleFin)
        Me.StyloTrace = stylo
    End Sub

    ' Constructeur avec brosse pour le remplissage
    Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal brosse As Brush)
        Me.New(x, y, rayon, AngleDep, AngleFin)
        Me.BrosseFond = brosse
    End Sub

    ' Constructeur avec stylo pour le contour et brosse pour le remplissage
    Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal stylo As Pen, ByVal brosse As Brush)
        Me.New(x, y, rayon, AngleDep, AngleFin, stylo)
        Me.BrosseFond = brosse
    End Sub
#End Region

#Region " Propriétés "
    ' Abscisse du centre
    Public Property X() As Integer
        Get
            Return Me._x
        End Get
        Set(ByVal value As Integer)
            Me._x = value
            Me.CalculerRectangle()
        End Set
    End Property

    ' Ordonnée du centre
    Public Property Y() As Integer
        Get
            Return Me._y
        End Get
        Set(ByVal value As Integer)
            Me._y = value
            Me.CalculerRectangle()
        End Set
    End Property

    ' Angle de départ de l'arc de Cercle
    Public Property Ang_Dep() As Single
        Get
            Return Me._AngDep
        End Get
        Set(ByVal value As Single)
            Me._AngDep = value
            Me.CalculerRectangle()
        End Set
    End Property

    ' Angle de fin de l'arc de Cercle
    Public Property Ang_Fin() As Single
        Get
            Return Me._AngFin
        End Get
        Set(ByVal value As Single)
            Me._AngFin = value
            Me.CalculerRectangle()
        End Set
    End Property

    ' Rayon du cercle
    Public Property Rayon() As Integer
        Get
            Return Me._rayon
        End Get
        Set(ByVal value As Integer)
            Me._rayon = value
            Me.CalculerRectangle()
        End Set
    End Property

    ' Rectangle entourant le cercle
    Public ReadOnly Property RectangleCirconscrit() As Rectangle
        Get
            Return Me._rectangle
        End Get
    End Property
#End Region

#Region " Méthodes "
    ' Mise à jour de la taille du rectangle circonscrit au cercle
    Protected Sub CalculerRectangle()
        Me._rectangle = New Rectangle(Me.X - Me.Rayon, Me.Y - Me.Rayon, Rayon * 2, Rayon * 2)
    End Sub

    ' Tracé du cercle
    Public Overrides Sub Tracer(ByVal g As System.Drawing.Graphics)
        Dim rct As New Rectangle(Me._rectangle.Location, Me._rectangle.Size)
        Dim mtx As Drawing2D.Matrix = Nothing

        ' Transformations
        If Me._angle <> 0 Then
            mtx = g.Transform
            g.TranslateTransform(Me._rectangle.X, Me._rectangle.Y)
            g.RotateTransform(Me._angle)

            ' Corriger le rectangle de départ
            rct.X = 0
            rct.Y = 0
        End If

        ' Tracer le fond s'il est défini       A FINIR
        If Me.BrosseFond IsNot Nothing Then
            'g.FillEllipse(Me.BrosseFond, rct)
        End If

        ' Tracer le contour s'il est défini
        If Me.StyloTrace IsNot Nothing Then
            g.DrawArc(Me.StyloTrace, rct, _AngDep, _AngFin)
        End If

        ' Annuler les transformations
        If Me._angle <> 0 Then
            g.Transform = mtx
        End If
    End Sub
#End Region
End Class


pour appeler le code cela doit ressembler a ceci

Dim Pen As New Pen(Color.Black, 2)
Dim b As New TraceCercle(250, 250, 125, Pen, redBrush)
b.Tracer(g)
Dim a As New TraceArcCercle(200, 200, 125, 1, 200, Pen)
a.Tracer(g)


g étant la variable Graphics de la form

Cordialement CGSI3

--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
triangle29 Messages postés 13 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 4 avril 2014 1
4 avril 2014 à 07:08
Bonjour CGSI3

J'ai un message d'erreur sur "AngleFin"

 ' Constructeur de base avec le stylo en supplément
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal stylo As Pen)
Me.New(x, y, rayon, AngleDep, AngleFin)
Me.StyloTrace = stylo
End Sub

' Constructeur avec brosse pour le remplissage
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal brosse As Brush)
Me.New(x, y, rayon, AngleDep, AngleFin)
Me.BrosseFond = brosse
End Sub

' Constructeur avec stylo pour le contour et brosse pour le remplissage
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal stylo As Pen, ByVal brosse As Brush)
Me.New(x, y, rayon, AngleDep, AngleFin, stylo)
Me.BrosseFond = brosse
End Sub<code>


Region " Propriétés " C'est OK

Region " Méthodes " Messages erreurs sur
Protected Sub " CalculerRectangle "
et sur Public Overrides Sub " Tracer "

Region " Méthodes " pas de modif ?



pour appeler le code cela doit ressembler a ceci

<code>Dim Pen As New Pen(Color.Black, 2)
Dim b As New TraceCercle(250, 250, 125, Pen, redBrush)
b.Tracer(g)
Dim a As New TraceArcCercle(200, 200, 125, 1, 200, Pen)
a.Tracer(g)

Je dois mettre ce code dans la form ?

Merci CGSI3
0
triangle29 Messages postés 13 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 4 avril 2014 1
4 avril 2014 à 07:14
Bonjour CGSI3

J'ai un message d'erreur sur "AngleFin"

 <code> ' Constructeur de base avec le stylo en supplément
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal stylo As Pen)
Me.New(x, y, rayon, AngleDep, AngleFin)
Me.StyloTrace = stylo
End Sub

' Constructeur avec brosse pour le remplissage
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal brosse As Brush)
Me.New(x, y, rayon, AngleDep, AngleFin)
Me.BrosseFond = brosse
End Sub

' Constructeur avec stylo pour le contour et brosse pour le remplissage
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal AngleDep As Single, ByVal AngleFin As Single, ByVal rayon As Integer, ByVal stylo As Pen, ByVal brosse As Brush)
Me.New(x, y, rayon, AngleDep, AngleFin, stylo)
Me.BrosseFond = brosse
End Sub<code>


Region " Propriétés " C'est OK

Region " Méthodes " Messages erreurs sur
Protected Sub " CalculerRectangle "
et sur Public Overrides Sub " Tracer "

Region " Méthodes " pas de modif ?


pour appeler le code cela doit ressembler a ceci

<code><code>Dim Pen As New Pen(Color.Black, 2)
Dim b As New TraceCercle(250, 250, 125, Pen, redBrush)
b.Tracer(g)
Dim a As New TraceArcCercle(200, 200, 125, 1, 200, Pen)
a.Tracer(g)
</code>

Je dois mettre ce code dans la form ?

Merci CGSI3
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
Modifié par CGSI3 le 4/04/2014 à 08:29
Bonjour triangle29.

Quand ton msg te semble mal écrit tu peux le modifier en bas (tant qu'il n'a pas de réponse) cela qui permet d'éviter 2 msg.

" Au passage la class TraceBase n'est pas décrite. Elle doit ressembler a ceci "
=> Peut tu m'envoyer le code de TraceBase Stp


" J'ai un message d'erreur sur "AngleFin"
=> Peut tu décrire ce message, car dans tout message d'erreur tu as une explication ou un code qui te permet d'avoir une idée de l'erreur.

IDEM décrit le message d'erreur sur les méthodes

Region " Méthodes " Messages erreurs sur
Protected Sub " CalculerRectangle "
et sur Public Overrides Sub " Tracer "

=> si j'ai un tout petit peu modifier "Tracer" , le message d'erreur sur CalculerRectangle n'est pas logique car il n'a subit aucune modification par rapport a l'autre class donc ??? mystère

Pour info j'ai entièrement intégré ton code sur une vieil appli 2D pour afficher des formes, et elle marche sans soucis, même si pour le moment je cherche comment afficher un PACMAN jaune et colorier l'intérieur de l'ARC


" Je dois mettre ce code dans la form ? "

oui , je t'ai décrit a la fin comment utiliser la class
Elle demande juste naturellement 2 variables de + qui correspondent aux angles de l'ARC (en degré)


Je continuerai surement cette discussion en mail si cela te conviens car sans avoir l'ensemble du projet je ne continuerai pas a imaginer comment est le code.
De plus ce post a largement répondu a la question comment Tracer un Arc, la on rentre dans le domaine de la correction de code.

Je t'envoi un MP

Cordialement CGSI3
--
0
Rejoignez-nous