begin process at 2010 02 10 10:09:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > TRACER UNE LIGNE OU UN CERCLE AVEC ANTICRÈNELAGE

TRACER UNE LIGNE OU UN CERCLE AVEC ANTICRÈNELAGE


 Information sur la source

Note :
8,33 / 10 - par 6 personnes
8,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Niveau :Initié Date de création :21/06/2004 Date de mise à jour :14/09/2004 08:12:31 Vu / téléchargé :4 725 / 427

Auteur : ennixo

Ecrire un message privé
Site perso
Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
voici un code permettant de tracer une ligne ou un cercle avec un anticrènelage

il vous suffit de mettre ça dans un module et d'appeller les fonctions DrawLineAA, DrawCircleAA (DrawLine et DrawCircle servent à la même chose sans anticrènelage et SetPixelAA c'est ce qui trace un pixel avec un antialias en fonction de ce qu'il y a après la virgule)


DeviceContext c'est le .hDC de l'objet sur lequel vous voulez tracer (par exemple Form1.hDC ou Picture1.hDC)

le ScaleMode de l'objet sur lequel on trace doit être sur 3 (vbPixel)

les autres paramètres sont assez explicites pour ne pas être commentés.

notez qu'avec SetPixelAA vous pouvez faire un code qui trace par exemple une élipse ou un triangle et au lieu de faire SetPixel vous remplaces par SetPixelAA en mettant des paramètres de type Double donc avec une virgule donc avec un anticrènelage :) et vous obtiendrez un superbe anticrènelage.

Source

  • ' ======================================
  • ' DECLARATIONS D'API
  • ' ======================================
  • Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  • Private Declare Function SetPixelV Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
  • ' ======================================
  • ' AVEC ANTICRENELAGE
  • ' ======================================
  • ' trace un pixel avec un anticrènelage
  • Public Sub SetPixelAA( _
  • ByVal DeviceContext As Long, _
  • ByVal XX As Single, _
  • ByVal YY As Single, _
  • ByVal r As Byte, _
  • ByVal g As Byte, _
  • ByVal b As Byte)
  • Dim BackR As Byte
  • Dim BackG As Byte
  • Dim BackB As Byte
  • Dim BackCol As Long
  • Dim xi As Long: xi = CLng(XX)
  • Dim yi As Long: yi = CLng(YY)
  • Dim xp As Single
  • Dim yp As Single
  • Dim pa As Single
  • Dim pb As Single
  • Dim pc As Single
  • Dim pd As Single
  • If xi > XX Then xi = xi - 1
  • If yi > YY Then yi = yi - 1
  • If xi <> XX And yi <> YY Then
  • xp = XX - xi
  • yp = YY - yi
  • pa = (1 - xp) * (1 - yp)
  • pb = xp * (1 - yp)
  • pc = (1 - xp) * yp
  • pd = xp * yp
  • BackCol = GetPixel(DeviceContext, xi, yi)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi, yi, RGB(r * pa + BackR * (1 - pa), g * pa + BackG * (1 - pa), b * pa + BackB * (1 - pa))
  • BackCol = GetPixel(DeviceContext, xi + 1, yi)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi + 1, yi, RGB(r * pb + BackR * (1 - pb), g * pb + BackG * (1 - pb), b * pb + BackB * (1 - pb))
  • BackCol = GetPixel(DeviceContext, xi, yi + 1)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi, yi + 1, RGB(r * pc + BackR * (1 - pc), g * pc + BackG * (1 - pc), b * pc + BackB * (1 - pc))
  • BackCol = GetPixel(DeviceContext, xi + 1, yi + 1)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi + 1, yi + 1, RGB(r * pd + BackR * (1 - pd), g * pd + BackG * (1 - pd), b * pd + BackB * (1 - pd))
  • ElseIf xi <> XX Then
  • pc = XX - xi
  • pa = 1 - (XX - xi)
  • BackCol = GetPixel(DeviceContext, xi, yi)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi, yi, RGB(r * pa + BackR * (1 - pa), g * pa + BackG * (1 - pa), b * pa + BackB * (1 - pa))
  • BackCol = GetPixel(DeviceContext, xi + 1, yi)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi + 1, yi, RGB(r * pc + BackR * (1 - pc), g * pc + BackG * (1 - pc), b * pc + BackB * (1 - pc))
  • ElseIf yi <> YY Then
  • pb = YY - yi
  • pa = 1 - (YY - yi)
  • BackCol = GetPixel(DeviceContext, xi, yi)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi, yi, RGB(r * pa + BackR * (1 - pa), g * pa + BackG * (1 - pa), b * pa + BackB * (1 - pa))
  • BackCol = GetPixel(DeviceContext, xi, yi + 1)
  • BackR = BackCol And &HFF
  • BackG = (BackCol \ &H100) And &HFF
  • BackB = (BackCol \ &H10000) And &HFF
  • SetPixelV DeviceContext, xi, yi + 1, RGB(r * pb + BackR * (1 - pb), g * pb + BackG * (1 - pb), b * pb + BackB * (1 - pb))
  • Else
  • SetPixelV DeviceContext, XX, YY, RGB(r, g, b)
  • End If
  • End Sub
  • ' trace une ligne avec anticrènelage
  • Public Sub DrawLineAA( _
  • ByVal DeviceContext As Long, _
  • ByVal x1 As Single, _
  • ByVal y1 As Single, _
  • ByVal x2 As Single, _
  • ByVal y2 As Single, _
  • ByVal Color As Long)
  • Dim m As Single
  • Dim b As Single
  • Dim XX As Single
  • Dim YY As Single
  • Dim rr As Byte: rr = Color And &HFF
  • Dim gg As Byte: gg = (Color \ &H100) And &HFF
  • Dim bb As Byte: bb = (Color \ &H10000) And &HFF
  • If x2 = x1 Then
  • m = (y2 - y1) / 1
  • Else
  • m = (y2 - y1) / (x2 - x1)
  • End If
  • b = y1 - (m * x1)
  • If Abs(m) <= 1 Then
  • If x1 <= x2 Then
  • For XX = x1 To x2 - 1
  • YY = m * XX + b
  • SetPixelAA DeviceContext, XX, YY, rr, gg, bb
  • Next XX
  • Else
  • For XX = x2 + 1 To x1
  • YY = m * XX + b
  • SetPixelAA DeviceContext, XX, YY, rr, gg, bb
  • Next XX
  • End If
  • Else
  • If y1 <= y2 Then
  • For YY = y1 To y2 - 1
  • XX = (YY - b) / m
  • SetPixelAA DeviceContext, XX, YY, rr, gg, bb
  • Next YY
  • Else
  • For YY = y2 + 1 To y1
  • XX = (YY - b) / m
  • SetPixelAA DeviceContext, XX, YY, rr, gg, bb
  • Next YY
  • End If
  • End If
  • End Sub
  • ' trace un cercle avec anticrènelage
  • Public Sub DrawCircleAA( _
  • ByVal DeviceContext As Long, _
  • ByVal X As Single, _
  • ByVal Y As Single, _
  • ByVal Rayon As Single, _
  • ByVal Color As Long)
  • Dim XX As Single
  • Dim YY As Single
  • Dim rr As Byte: rr = Color And &HFF
  • Dim gg As Byte: gg = (Color \ &H100) And &HFF
  • Dim bb As Byte: bb = (Color \ &H10000) And &HFF
  • If Rayon = 0 Then Exit Sub
  • SetPixelAA DeviceContext, X + Rayon, Y, rr, gg, bb
  • SetPixelAA DeviceContext, X, Y + Rayon, rr, gg, bb
  • SetPixelAA DeviceContext, X, Y - Rayon, rr, gg, bb
  • SetPixelAA DeviceContext, X - Rayon, Y, rr, gg, bb
  • For XX = 1 To Rayon * 0.71 ' = 1 / Sqr(2)
  • YY = Sqr(Rayon * Rayon - XX * XX)
  • SetPixelAA DeviceContext, XX + X, YY + Y, rr, gg, bb
  • SetPixelAA DeviceContext, -XX + X, YY + Y, rr, gg, bb
  • SetPixelAA DeviceContext, XX + X, -YY + Y, rr, gg, bb
  • SetPixelAA DeviceContext, -XX + X, -YY + Y, rr, gg, bb
  • SetPixelAA DeviceContext, YY + X, XX + Y, rr, gg, bb
  • SetPixelAA DeviceContext, -YY + X, XX + Y, rr, gg, bb
  • SetPixelAA DeviceContext, YY + X, -XX + Y, rr, gg, bb
  • SetPixelAA DeviceContext, -YY + X, -XX + Y, rr, gg, bb
  • Next XX
  • End Sub
  • ' ======================================
  • ' SANS ANTICRENELAGE
  • ' ======================================
  • ' trace une ligne
  • Public Sub DrawLine( _
  • ByVal DeviceContext As Long, _
  • ByVal x1 As Long, _
  • ByVal y1 As Long, _
  • ByVal x2 As Single, _
  • ByVal y2 As Single, _
  • ByVal Color As Long)
  • Dim m As Single
  • Dim b As Single
  • Dim XX As Long
  • Dim YY As Long
  • If x2 = x1 Then
  • m = (y2 - y1) / 1
  • Else
  • m = (y2 - y1) / (x2 - x1)
  • End If
  • b = y1 - (m * x1)
  • If Abs(m) <= 1 Then
  • If x1 <= x2 Then
  • For XX = x1 To x2 - 1
  • YY = m * XX + b
  • SetPixelV DeviceContext, XX, YY, Color
  • Next XX
  • Else
  • For XX = x2 + 1 To x1
  • YY = m * XX + b
  • SetPixelV DeviceContext, XX, YY, Color
  • Next XX
  • End If
  • Else
  • If y1 <= y2 Then
  • For YY = y1 To y2 - 1
  • XX = (YY - b) / m
  • SetPixelV DeviceContext, XX, YY, Color
  • Next YY
  • Else
  • For YY = y2 + 1 To y1
  • XX = (YY - b) / m
  • SetPixelV DeviceContext, XX, YY, Color
  • Next YY
  • End If
  • End If
  • End Sub
  • ' trace un cercle
  • Public Sub DrawCircle( _
  • ByVal DeviceContext As Long, _
  • ByVal X As Long, _
  • ByVal Y As Long, _
  • ByVal Rayon As Long, _
  • ByVal Color As Long)
  • Dim XX As Long
  • Dim YY As Long
  • Dim rr As Byte: rr = Color And &HFF
  • Dim gg As Byte: gg = (Color \ &H100) And &HFF
  • Dim bb As Byte: bb = (Color \ &H10000) And &HFF
  • If Rayon = 0 Then Exit Sub
  • SetPixelV DeviceContext, X + Rayon, Y, Color
  • SetPixelV DeviceContext, X, Y + Rayon, Color
  • SetPixelV DeviceContext, X, Y - Rayon, Color
  • SetPixelV DeviceContext, X - Rayon, Y, Color
  • For XX = 1 To Rayon * 0.71 ' = 1 / Sqr(2)
  • YY = Sqr(Rayon * Rayon - XX * XX)
  • SetPixelV DeviceContext, XX + X, YY + Y, Color
  • SetPixelV DeviceContext, -XX + X, YY + Y, Color
  • SetPixelV DeviceContext, XX + X, -YY + Y, Color
  • SetPixelV DeviceContext, -XX + X, -YY + Y, Color
  • SetPixelV DeviceContext, YY + X, XX + Y, Color
  • SetPixelV DeviceContext, -YY + X, XX + Y, Color
  • SetPixelV DeviceContext, YY + X, -XX + Y, Color
  • SetPixelV DeviceContext, -YY + X, -XX + Y, Color
  • Next XX
  • End Sub
' ======================================
' DECLARATIONS D'API
' ======================================

Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long


' ======================================
' AVEC ANTICRENELAGE
' ======================================

' trace un pixel avec un anticrènelage
Public Sub SetPixelAA( _
    ByVal DeviceContext As Long, _
    ByVal XX As Single, _
    ByVal YY As Single, _
    ByVal r As Byte, _
    ByVal g As Byte, _
    ByVal b As Byte)
    
    Dim BackR       As Byte
    Dim BackG       As Byte
    Dim BackB       As Byte
    Dim BackCol     As Long
    
    Dim xi          As Long: xi = CLng(XX)
    Dim yi          As Long: yi = CLng(YY)
    
    Dim xp          As Single
    Dim yp          As Single
    
    Dim pa          As Single
    Dim pb          As Single
    Dim pc          As Single
    Dim pd          As Single
    
    If xi > XX Then xi = xi - 1
    If yi > YY Then yi = yi - 1
    
    If xi <> XX And yi <> YY Then
    
        xp = XX - xi
        yp = YY - yi
    
        pa = (1 - xp) * (1 - yp)
        pb = xp * (1 - yp)
        pc = (1 - xp) * yp
        pd = xp * yp
        
        BackCol = GetPixel(DeviceContext, xi, yi)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi, yi, RGB(r * pa + BackR * (1 - pa), g * pa + BackG * (1 - pa), b * pa + BackB * (1 - pa))
        
        BackCol = GetPixel(DeviceContext, xi + 1, yi)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi + 1, yi, RGB(r * pb + BackR * (1 - pb), g * pb + BackG * (1 - pb), b * pb + BackB * (1 - pb))
    
        BackCol = GetPixel(DeviceContext, xi, yi + 1)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi, yi + 1, RGB(r * pc + BackR * (1 - pc), g * pc + BackG * (1 - pc), b * pc + BackB * (1 - pc))

        BackCol = GetPixel(DeviceContext, xi + 1, yi + 1)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi + 1, yi + 1, RGB(r * pd + BackR * (1 - pd), g * pd + BackG * (1 - pd), b * pd + BackB * (1 - pd))
    
    ElseIf xi <> XX Then

        pc = XX - xi
        pa = 1 - (XX - xi)

        BackCol = GetPixel(DeviceContext, xi, yi)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi, yi, RGB(r * pa + BackR * (1 - pa), g * pa + BackG * (1 - pa), b * pa + BackB * (1 - pa))
        
        BackCol = GetPixel(DeviceContext, xi + 1, yi)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi + 1, yi, RGB(r * pc + BackR * (1 - pc), g * pc + BackG * (1 - pc), b * pc + BackB * (1 - pc))

    ElseIf yi <> YY Then
    
        pb = YY - yi
        pa = 1 - (YY - yi)

        BackCol = GetPixel(DeviceContext, xi, yi)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi, yi, RGB(r * pa + BackR * (1 - pa), g * pa + BackG * (1 - pa), b * pa + BackB * (1 - pa))
        
        BackCol = GetPixel(DeviceContext, xi, yi + 1)
        BackR = BackCol And &HFF
        BackG = (BackCol \ &H100) And &HFF
        BackB = (BackCol \ &H10000) And &HFF
        SetPixelV DeviceContext, xi, yi + 1, RGB(r * pb + BackR * (1 - pb), g * pb + BackG * (1 - pb), b * pb + BackB * (1 - pb))
    
    Else
        
        SetPixelV DeviceContext, XX, YY, RGB(r, g, b)
        
    End If
    
End Sub

' trace une ligne avec anticrènelage
Public Sub DrawLineAA( _
    ByVal DeviceContext As Long, _
    ByVal x1 As Single, _
    ByVal y1 As Single, _
    ByVal x2 As Single, _
    ByVal y2 As Single, _
    ByVal Color As Long)
    
    Dim m       As Single
    Dim b       As Single
    Dim XX      As Single
    Dim YY      As Single
    
    Dim rr       As Byte: rr = Color And &HFF
    Dim gg       As Byte: gg = (Color \ &H100) And &HFF
    Dim bb       As Byte: bb = (Color \ &H10000) And &HFF
    
    If x2 = x1 Then
        m = (y2 - y1) / 1
    Else
        m = (y2 - y1) / (x2 - x1)
    End If
    
    b = y1 - (m * x1)
    
    If Abs(m) <= 1 Then
        If x1 <= x2 Then
            For XX = x1 To x2 - 1
                YY = m * XX + b
                SetPixelAA DeviceContext, XX, YY, rr, gg, bb
            Next XX
        Else
            For XX = x2 + 1 To x1
                YY = m * XX + b
                SetPixelAA DeviceContext, XX, YY, rr, gg, bb
            Next XX
        End If
    Else
        If y1 <= y2 Then
            For YY = y1 To y2 - 1
                XX = (YY - b) / m
                SetPixelAA DeviceContext, XX, YY, rr, gg, bb
            Next YY
        Else
            For YY = y2 + 1 To y1
                XX = (YY - b) / m
                SetPixelAA DeviceContext, XX, YY, rr, gg, bb
            Next YY
        End If
    End If
    
End Sub

' trace un cercle avec anticrènelage
Public Sub DrawCircleAA( _
    ByVal DeviceContext As Long, _
    ByVal X As Single, _
    ByVal Y As Single, _
    ByVal Rayon As Single, _
    ByVal Color As Long)

    Dim XX      As Single
    Dim YY      As Single

    Dim rr       As Byte: rr = Color And &HFF
    Dim gg       As Byte: gg = (Color \ &H100) And &HFF
    Dim bb       As Byte: bb = (Color \ &H10000) And &HFF
    
    If Rayon = 0 Then Exit Sub
    
    SetPixelAA DeviceContext, X + Rayon, Y, rr, gg, bb
    SetPixelAA DeviceContext, X, Y + Rayon, rr, gg, bb
    SetPixelAA DeviceContext, X, Y - Rayon, rr, gg, bb
    SetPixelAA DeviceContext, X - Rayon, Y, rr, gg, bb
    
    For XX = 1 To Rayon * 0.71 ' = 1 / Sqr(2)
        
        YY = Sqr(Rayon * Rayon - XX * XX)
        
        SetPixelAA DeviceContext, XX + X, YY + Y, rr, gg, bb
        SetPixelAA DeviceContext, -XX + X, YY + Y, rr, gg, bb
        SetPixelAA DeviceContext, XX + X, -YY + Y, rr, gg, bb
        SetPixelAA DeviceContext, -XX + X, -YY + Y, rr, gg, bb

        SetPixelAA DeviceContext, YY + X, XX + Y, rr, gg, bb
        SetPixelAA DeviceContext, -YY + X, XX + Y, rr, gg, bb
        SetPixelAA DeviceContext, YY + X, -XX + Y, rr, gg, bb
        SetPixelAA DeviceContext, -YY + X, -XX + Y, rr, gg, bb
        
    Next XX
    
End Sub


' ======================================
' SANS ANTICRENELAGE
' ======================================

' trace une ligne
Public Sub DrawLine( _
    ByVal DeviceContext As Long, _
    ByVal x1 As Long, _
    ByVal y1 As Long, _
    ByVal x2 As Single, _
    ByVal y2 As Single, _
    ByVal Color As Long)
    
    Dim m       As Single
    Dim b       As Single
    Dim XX      As Long
    Dim YY      As Long
    
    If x2 = x1 Then
        m = (y2 - y1) / 1
    Else
        m = (y2 - y1) / (x2 - x1)
    End If
    
    b = y1 - (m * x1)
    
    If Abs(m) <= 1 Then
        If x1 <= x2 Then
            For XX = x1 To x2 - 1
                YY = m * XX + b
                SetPixelV DeviceContext, XX, YY, Color
            Next XX
        Else
            For XX = x2 + 1 To x1
                YY = m * XX + b
                SetPixelV DeviceContext, XX, YY, Color
            Next XX
        End If
    Else
        If y1 <= y2 Then
            For YY = y1 To y2 - 1
                XX = (YY - b) / m
                SetPixelV DeviceContext, XX, YY, Color
            Next YY
        Else
            For YY = y2 + 1 To y1
                XX = (YY - b) / m
                SetPixelV DeviceContext, XX, YY, Color
            Next YY
        End If
    End If
    
End Sub

' trace un cercle
Public Sub DrawCircle( _
    ByVal DeviceContext As Long, _
    ByVal X As Long, _
    ByVal Y As Long, _
    ByVal Rayon As Long, _
    ByVal Color As Long)

    Dim XX      As Long
    Dim YY      As Long

    Dim rr       As Byte: rr = Color And &HFF
    Dim gg       As Byte: gg = (Color \ &H100) And &HFF
    Dim bb       As Byte: bb = (Color \ &H10000) And &HFF
    
    If Rayon = 0 Then Exit Sub
    
    SetPixelV DeviceContext, X + Rayon, Y, Color
    SetPixelV DeviceContext, X, Y + Rayon, Color
    SetPixelV DeviceContext, X, Y - Rayon, Color
    SetPixelV DeviceContext, X - Rayon, Y, Color
    
    For XX = 1 To Rayon * 0.71 ' = 1 / Sqr(2)
        
        YY = Sqr(Rayon * Rayon - XX * XX)
        
        SetPixelV DeviceContext, XX + X, YY + Y, Color
        SetPixelV DeviceContext, -XX + X, YY + Y, Color
        SetPixelV DeviceContext, XX + X, -YY + Y, Color
        SetPixelV DeviceContext, -XX + X, -YY + Y, Color

        SetPixelV DeviceContext, YY + X, XX + Y, Color
        SetPixelV DeviceContext, -YY + X, XX + Y, Color
        SetPixelV DeviceContext, YY + X, -XX + Y, Color
        SetPixelV DeviceContext, -YY + X, -XX + Y, Color
        
    Next XX
    
End Sub

 Conclusion

14/09/2004 :
- j'ai corrigé la faute à "anticrènelage" selon l'académie française.

24/06/2004 :
- j'ai remplacé SetPixel par SetPixelV
- j'ai viré les Double que j'ai remplacé par des Long là ou il n'y avait pas lieu d'utiliser des Double.
- J'ai remplacé tous les Double par des Single qui sont plus rapides que les Doubles car moins précis (mais nous n'avons pas besoin de Double ici)

Merci à vlad2 ;)


22/06/2004
- J'ai modifié un peu le code dans SetPixelAA, en effet il y avait une erreur, maintenant c'est nickel !


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

14 septembre 2004 08:12:31 :
j'ai corrigé la faute à "anticrènelage" selon l'académie française.

 Sources du même auteur

Source avec Zip Source avec une capture TORSION D'IMAGE
Source avec Zip Source avec une capture FLOUS (GAUSSIEN, RADIAL, SPIRALE, DIRECTIONNEL, ET D'AUTRES....
Source avec Zip Source avec une capture ENNIXO FILS (LOGICIEL DE TRACÉS DE LIGNES ARTISTIQUES)
Source avec Zip PICTUREBOX QUI FAIT DES FONDU ENTRE LES IMAGES CHARGÉES ET Q...
Source avec Zip FONCTIONS COOL POUR MODIFIER ET ANIMER LES FENÊTRES

 Sources de la même categorie

Source avec Zip ALBUM PHOTOS par ayoube2009
Source avec Zip Source avec une capture EDITEUR D'AUTOMATES CELLULAIRES par PADYVEN
Source avec Zip Source avec une capture PROGRAMME DE DESSIN À LA SOURIS AVEC OUVERTURE ET ENREGISTRE... par SnkVrt
Source avec Zip Source avec une capture Source .NET (Dotnet) PHOTOSEXPRESS - TRAITEMENT DE PHOTOS par zozo14
Source avec Zip Source avec une capture ÉCRIRE SUR LE WALLPAPER par Rafale71

Commentaires et avis

Commentaire de tmcuh le 22/06/2004 10:34:25

Joli boulot. 10/10 clap clap clap (applaudissement loOol)

Commentaire de ennixo le 23/06/2004 12:02:30

merci :)
ça fait plaisir

Commentaire de sibi12 le 23/06/2004 12:47:55

Salut

beau boulot...mais tu peux ameliorrer en utilisant les apis Get/SetDIBits  au lieu Get/SetPixel niveau performance les differences peuvent être assez importante...

www.AllApi.net si tu vx connaitre l'utilisation de l'api.

Commentaire de vlad2i le 24/06/2004 10:10:11

Salut !

Trois petites suggestions...

1. Utilise SetPixelV au lieu de SetPixel, tu gagnera 30% de vitesse
2. Je ne vois pas l'intéret de placer XX et YY en Double avant de faire un SetPixel, parceque de toute façon ca ne marche qu'avec les entiers
3. Concernant la gestion des couleurs (Les opérations de Shift à répétition) le conseil de sibi12 est à suivre : en utilisant le groupe GetBitmapBits/SetDeviceBitmapBits tu devrais pouvoir gagner à la fois en performance, puisque ce serait la carte graphique qui traiterait l'affichage, et aussi car tu aurais accès directement aux 3 composantes couleur

Voila !

Vlad :)

Commentaire de ennixo le 24/06/2004 19:07:11

@ sibi12 :
oui c'est vrai, j'utilise d'ailleurs beaucoup cette API mais étant donné la presque rapidité de traçage des lignes et cercles (comparé à une image entière à tracer) j'ai préféré utiliser SetPixel (et maintenant SetPixelV). Mais c'est vrai que Get/SetDIBits et Get/SetBitmapBits sont super rapides.


@ vlad2i :
1. Excellent je ne connaissais pas du tout !!
2. Oui c'est vrai c'est parce que j'ai prit les DrawAA respectifs que j'ai modifié pour les simplifier et j'ai oublié de les changer.
3. voir @ sibi12


jvé updater bientot...

Commentaire de TouTenN le 02/11/2004 11:55:09

Bonjour

Code très utile pour moi qui crée des cercles très petits. Mais y aurait-il une possibilité pour pouvoir les remplir d'une couleur???

merci

GuY

Commentaire de ennixo le 02/11/2004 17:07:01

oui c'est possible mais soit il faut modifier l'algo (je n'ai encore jamais réfléchis comment) soit il faut tracer le cercle un peu différement (sans anticrènelage intérieur) puis faire un floodfill.

je vais y réfléchir :)

Commentaire de sibi12 le 02/11/2004 17:18:41

On a qu'à ne pas tenir compte de la couleur du pixel a l'interieur du cercle et faire comme si il avait la couleur par laquelle on veux remplir le cercle...

sinon Pourquoi pas remplir le cercle avant de le tracer..enfin c'est pas très clair dit comme ca mais on connais la zone interieur au cercle on met dc ces point la dans le couleur voulue et on trace ensuite notre cercle avec l'anti crenelage...

Commentaire de RDX le 20/11/2004 20:52:25

La seule chose qui manque (pour moi), c'est le parametre 'épaisseur de la ligne'. Sinon je trouve ca vraiment terrible.

Incontournable même pour ceux qui aiment les interfaces travaillées.

bravo.

Commentaire de ero_senin le 17/01/2005 14:19:34

ta source  à l'air pas mal du tout en plus ça correcpond à ce que je veux faire mais j'ai un petit souci j'utilise vb.net et il me marque : le nom 'Abs' n'est pas déclaré .... quelqu'un pourai m'aider.... :(

Commentaire de ennixo le 17/01/2005 14:44:37

en .Net c'est une méthode statique de la classe Math

il faut faire Math.Abs

Commentaire de ero_senin le 17/01/2005 15:10:47

merci ennixo
tu va me prendre pour un gayzor mais le parametre : DeviceContext sert à quoi je doit mettre quoi quand j'apelle DrawLineAA par exemple...
désolé pour mes question à la con de débutant

Commentaire de ennixo le 17/01/2005 15:32:39

en fait si cette source avait été en .Net elle n'aurait pas utilisé les API GetPixel et SetPixel mais les objets déjà présents dans le framework, objets que je ne connais pas car je ne m'y suis jamais interessé...

Commentaire de ScSami le 08/02/2005 00:23:41

Franchement, BRAVO, 9/10.

9 parce qu'a mon gout, pas assez commenté pi mettre une form, ça coute rien...

Il faut quand même le dire :  C'EST LA BASE DE TOUT PROG D'INFOGRAPHIE PERFORMANT !!! Je dirais même que C'EST LA BASE DE L'INFOGRAPHIE...

Note :  J'ai lu sur VB-France qu'un codeur appelais ça (je parle ici du principe) un "Wu pixel"... Si quelqu'un a plus d'infos sur ce mysterieux "Wu" je suis prenneur!

Et puis pour le Cercle... DU GRAND ART (c.f. ma povre source en comparaison...). FRANCHEMENT, MERCI. Je crois que c'est la méthode de traçage des cercles la plus efficace et la plus rapide (si quelqu'un a à redire, je serais curieux de voir ce qu'il pourrait bien proposer d'encore mieux... [je déconne, c'est pas possible de faire mieux ;-) ]). D'ailleurs, même le VB fait des cercles moins jolis.

Par contre, n'ayant pas un super niveau [3ème de college] en trigo (alors que ça me passionne), je m'intéroge toujour sur ce "Rayon * 1/Sqr(2)"... J'ai beau chercher, je comprends pas.

Et j'en profite d'ailleurs pour passer un petit message perso :

SI QUELQU'UN SAIT COMMENT PI EST CALCULÉ, JE VOUS SUPPLIE A QUATRE GENOUX, DITES-LE MOI !!!!!!
Je peux plus en dormir de la nuit... surtout quand aucun prof de math que j'ai pu rencontré (et dieu seul sait combien j'en ai eu...) n'a été capable de me répondre...

Je cherche également à savoir, si quelqu'un le sait (!), comment mon très cher Pythagore a fait pour nous pondre sa théorie... Avec quels outils mathématiques, par quel raisonnement, ..., ..., ... Et également, QUI A "découvert" les sinus, cosinus, ... Pi dans la foullée, A QUOI PEUVENT BIEN SERVIR LES GRADES ???

@++

Commentaire de sibi12 le 08/02/2005 02:37:38

Pour le calcul de Pi : http://www.google.fr/search?q=calcul+de+pi&sourceid=mozilla&start=0&start=0&ie=utf-8&oe=utf-8

Pour pythagore si je me souviens bien de mon cours de 3eme...ca remonte ct a partir de thales qu'il a elaborer sa formule...maintenant pkoi il s'est lever un matin en se disant aujourd'hui je calcule l'hypothenuse de ce triangle rectangle... je n'en sais rien... tout ce que je sais c'est que thales lui voulais mesurer la taille des pyramides a partir de leur ombre

les sinus cosinus et tout ca decoule un peu de la mesure des angles je pense pas qu'il y ai eu vmt un inventeur... c comme la mesure d'une longueur

Pour le grade une tite recherche sur google et : http://histoiredechiffres.neuf.fr/histoire%20notations/page/unites%20d'angles.htm

"Comme le méridien terrestre mesure environ 10 000 km , on peut aisément calculer les trajets le long des méridiens : un radian correspond à une distance de 100 km sur le méridien.

Seuls les géodésiens continuent d'utiliser le grade couramment . "

Commentaire de ennixo le 08/02/2005 21:39:20

merci pour ton commentaire ScSami ça fait plaisir =)

je ne peux répondre qu'à une de tes question : celle du 1 / Sqr(2)
en fait c'est très simple, si tu regarde mon algo je calcule une petite portion du cercle (1/8e du cercle pour etre exact) que je trace par symétrie pour former le cercle complet.
de plus je calcule le y en fonction du x.
le rayon * 1 / Sqr(2) c'est la valeur ou x = y et ou donc il faut s'arreter pour éviter ce qu'on appelle l'overstrike, c'est le fait de tracer plusieurs fois des pixels au même endroit =)

j'ai pas inventé tout ça je me suis inspiré d'un bouquin pas mal (et pas cher comparé à d'autres !!) : Computer Graphics de chez Schaum's (auteurs: Zhigang Xiang et Roy Plastock)

Commentaire de vlad2i le 08/02/2005 22:16:50

ScSami> Coucou !
C'est moi le codeur qui ait lancé le code des Wu Pixels... pour celui que ca interesse.

Par ailleurs je compte bien balancer un joli code d'ici mi-fevrier qui les utilise (et l'effet sera, je l'espère, saisissant)

Si tu veux savoir qui est le Professeur Wu, je t'informe que tu ne pourra le rencontrer, pour cause de décès dans les années 80. C'est lui qui a proposé une méthode efficace (les Wu-...) pour dessiner des objets anticrénelés sur un écran. Le principe, cependant, n'est pas le meme que celui ci...

Je ne fais qu'informer :)

Pour le cercle, il y a d'autres méthodes, pas forcément "meilleures" mais ca dépend de tes critères

X^2 + Y^2 = R^2

d"où on sort notr

Y^2 = R^2-X^2

Y1 = racine(R*R-X*X)
Y2 = -Y1

Tu place les deux points Y1 et Y2 pour chaque valeur de X entre -R et +R et tu as un cercle... ca n'est pas très très efficace, mais ca marche plus rapidement sur les vielles machines.

Quant à pi, tu as, je crois, des millions de façons de le calculer... ne serait-ce que le simplissime Pi = 4* atn(1) jusqu'aux très complexes intégrales et sommes infinies qui permettent de trouver le xième nombre binaire...Mais si tu veux il doit bien me rester des vieux codes en basic qui calculent 10000 décimales par minute.

Sinus = Pli en latin, donné je crois par monsieur René Descartes au rapport Y/Longueur...

Ensuite, hehe, Pythagore : il n'y a besoin d'aucune preuve pour proposer un théorème. Mais celui ci s'est avéré exact jusqu'ici (dans les géométries euclidiènnes, du moins) en 1D, 2D, 3D et 4D.

Les grades maintenant, et je finirais sur ca : 400 grades = 360 ° = 2*pi radians (tient, une autre méthode pour pi : tu mesures un arc de 180° d'un cercle de rayon 1 :) ) je crois que ca n'a effectivement plus tellement d'utilité, seulement dans les coordonnées militaires, car on peut plus facilement décomposer des grades :

400->200->100->50->25->12grd5"...
360->180->90>45->22°5"...

Enfin ca reste discutable. Sinon les méridiens me semblent une approche possible aussi.

Pour simplifier la réponse de l'auteur :

Diagonale d'un carré de 1×1 = sqr(2)
Comme il veut que l'intensité décroisse (rappel : i = k/r²) si le point s'éloigne, il prend l'inverse : 1/sqr(2)

Je suis clair hehe (enfin plus obscur c'est dur)
Au moins j'ai essayé de répondre à tout hehe

Vlad

Commentaire de ennixo le 08/02/2005 22:57:14

un dernier détail...

si vous regardez bien les cercles vous pourrez voir qu'il y a sur certains cercles 4 points plus visibles ou 4 points moins visibles... c'est un des défauts de mon algo que je ne suis pas arrivé à améliorer.
de plus si vous tracez une ligne parfaitement verticale il y aura quand meme un décalage de 1 pixel entre le haut et le bas.

sinon, pour ceux qui ne l'ont pas encore vu j'ai déposé une source qui utilise ces bases d'algo sauf que ça calcule dans des tableaux pour gagner en perf (et heureusement !) : http://www.vbfrance.com/codes/ENNIXO_FILS_-LOGICIEL_DE_TRACES_DE_LIGNES_ARTISTIQUES-/27250.aspx
je dis pas ça pour faire ma pub, je dis ça parce que ça va un peu plus loin car je trace des courbes de bézier =)

et si vous êtes interessés par ça je peux mettre la nouvelle source, encore buggée, mais qui permet de faire ça : http://ennixo.free.fr/fils/vid/2.html

Commentaire de ScSami le 09/02/2005 12:51:58

Ennixo, Sibi12 et Vlad2i, VRAIMENT MERCI POUR TOUS CES PRECIEUX DÉTAILS...

Vous êtes des chefs (en math comme en prog). Heureusement qu'il y a des gens comme vous sur cette povre terre... parce qu'avec des mecs comme moi, on irrait pas loin ;-)

Maintenant je vais peut-être enfin trouver le sommeil (depuis 10 ans sans dormir, ça fera du bien une petite nuit de sommeil ;-).

Cependant, il me reste encore une ou deux petites questions (noooonnnn... ben si :-D).

PI=4*ATN(1)... en radians. Ca marche, c'est super. Mais bon, je serais d'accord avec ça si je le comprennais... Parce que là, ma question est : COMMENT CALCULER [avec explications parce que je comprends vite si on m'explique longtemps...] L'ARC-TANGENTE EN RADIAN ???

Sinon, j'ai pas vraiment compris ce 1/SRQ(2) mais je vais faire travailler mes cellules grises (ou noir de nécrose depuis le temps...).

Quant à "i=k/R2", mouai, je crois avoir pigé ça nickel ;-)

Non, plus sérieusement :
Ma question porte sur les Bézier... Je ne comprends pas vraiment l'équation (si quelqu'un pouvait m'aider).
Mais ce que j'aimerais le plus au monde (a part moi même et vous... dans le futur...) serait d'obtenir des courbes de Bézier en 3D... Et comme je comprends pas cette formule magique, ben j'aimerais que vous m'aidiez (ou la fassiez [c'est mieux ça comme solution...]).
Bien sûr, il faut considérer la 3ème dim en pixels ("Pixels 3D")...

Ce qui m'amène a un autre petit message :
J'en ai un peu marre de la 3D vectorielle et j'aimerais obtenir de la 3D Volumique, c.a.d. oú l'on considère que le volume de la scène est constitué de pixels. Ceci n'étant faisable qu'avec des Wu pixels et ne les ayant découverts que récemment, il serait bien de s'y mettre. Bien sur, il faudrait utiliser des fichiers compressés (en RLE p.ex.) laissant l'air vide.

Si ça vous interresse...

Et encore un grand merci du fond du coeur pour toutes vos remarques hyper constructives...

Commentaire de vlad2i le 09/02/2005 19:10:06

ScSami> je doutes que ce soit le lieu le plus approprié à tes questions métaphyisiques...

Pi = 4atn(1) ...

Tu as aussi pi²/6 = 1/1² + 1/2² + 1/3² + 1/4² + 1/5² + 1/6² etc ...

Le problème se trouvera au niveau de la précision des chiffres que tu utilises

pi ... 3.14159265358979323846264338327950288 41971693993751058209749445923 ...


En fait, il n'existe pas d'expression finie de Pi, car ce nombre est transcendant irrationnel, et on n'a que des algèbres infinies pour ce type de nombre. Donc, il faut faire tourner un calcul, théoriquement à l'infini, pour avoir le resultat exact. N'ayant pas tout ce temps, on se contente de le faire tourner "un certain temps" ce qui te donne "un certain nombre de décimales"

Ex: tu intègres de infini- à infini+ la fonction e^(-x²)dx et tu obtiendras la racine de pi... Ou la fonction gamma(1/2) = racine de pi ... ou l'intégrale de racine de (1--x²) sur [0;1] donne pi/4

Une meilleure méthode consiste à calculer les arctangentes, qui sont faciles a développer

ex: atn(1) = 4 (atn(1/5) - 4atn(1/239))
ou atn(1) = 44atn(1/57)+7atn(1/239)-12atn(1/682)+24atn(1/12943)

Et comme tu as atn(1) = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 ...

Tu peux facilement développer...

Liens utiles :
http://jc.michel.free.fr/pi.php
http://ktd.club.fr/programmation/cpp-metaprog.php

PS. Pour bézier, c'est une interpolation pondérée du troisième degré. Si tu as l'equation de bézier en 2D, il suffit d'ajouter la troisième, Z, pour avoir le resultat escompté. Quant aux rendus volumiques, nul besoin des Wu Pixels...

Bonne chance

Vlad

Commentaire de sibi12 le 09/02/2005 21:19:15

ScSami >
"PI=4*ATN(1)... en radians. Ca marche, c'est super. Mais bon, je serais d'accord avec ça si je le comprennais..."

tu comprend pas pourquoi ca fait Pi ???
ATN(1) est l'angle dont la tangeante = 1 c a d 45°.Puisque le tour du cercle fait 2Pi radiand = 360°, 4*45° = 180° = Pi radian. dc 4*ATN(1) = Pi.

Pr la 3D volumique tu veux dire coder tout les pixels dans ton fichier??? tu va avoir plusieur probleme... qd les objets proche de l'observateur auront une resolution trop faible et on vera les "pixels cubique" alors que ceux plus loin auront de l'information qu'on ne verra pas.
A moins que tu dessine en axonometries c a d sans point de fuite puisque les objet auront la meme taille qu'il soit loin ou proche. La il y a une technique tout bête avec des matrices c vraiment tailler pour être coder ^^

Commentaire de ScSami le 09/02/2005 21:48:09

Encore merci pour toutes ces précisions...

Vlad2i :  ok, maintenant je crois avoir vraiment tout compris...

XbY : Là je comprends mieux :-) Pour la 3D il faut considérer les objets au premier plan comme étant les plus précis et disparaissant au dessus(-1) de ce 1er plan. Le fichier, quant à lui, ne doit stocker que ce qui est important... Rien n'empêche d'utiliser des fonctions de flood 3D (entre autre)... Enfin, quand j'aurais le temps je pense faire une petite démo ici. Mais il est inévitable de passer par les "Wu" (ou du moins, une technique similaire).

Commentaire de rayver le 30/01/2008 09:33:26

hi
Mon petit mot en passant car je fais du delphi, tout le monde n'est pas parfait....hi,hi

Ligne 290:
YY = sqr(Rayon*Rayon - XX*XX)  ??? bizarre

Je ne connais pas VB mais SQR en pascal fais le carré et non la racine carrée.EN Pascal c'est SQRT qu'il faut mettre. (bizare aussi)

En plus les boucles 'FOR' avec du boolean, ne sont pas acceptées.
J'ai été obligé de faire des 'REPEAT'.....'UNTIL' pour que les conditions booleenes soit acceptées.

En plus en VB vous melangez les 'byte avec les single' dans les operations,Qui n'est pas accepté non plus.

Resultat: je fais bien des lignes et des cercles, mais sans anti aliasing.
A+++ les VB

Commentaire de rayver le 30/01/2008 09:37:11

Je peux ous mettre mon source pour vérification de mon topic
hobbyF1

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales