je commence par ceci pour remettre tous les bout de code que j'avais chez moi de l'ancien forum fr.
donc c parti, y'a du boulot, jen ai un paquet.
ce code ci permet de faire des cercles avec lissage. bien commenté et tout et tout. près à l'emploi quoi
Code : Tout sélectionner
Procedure Cercle(cx.l, cy.l, rx.l, ry.l, couleur.l, Lumiere.f, OutputID.l)
; Cette procedure permet de dessiner une ellipse avec lissage
; cx = Centre de l'ellipse sur les x
; cy = Centre de l'ellipse sur les y
; rx = Rayon de l'ellipse sur les x
; ry = Rayon de l'ellipse sur les y
; couleur = Couleur de tracé
; Lumiere = Coefficient permettant d'ajuster le lissage en fonction de la couleur de fond et de celle du cercle
; Lumiere = 1/2 : couleur claire
; Lumiere = 1 : couleur foncée
; Lumiere = 2/3 : couleur intermédiaire
; Toutes les valeurs sont acceptées
; Plus Lumiere tant vers 0 et plus la couleur est éclaircie
; Plus Lumiere tant vers l'infini et plus la couleur est assombrie
; Quand lumière = 1, il n'y a pas de modification des couleurs
; OutputID = la valeur OutputID de la fenêtre en cours nécessaire à StartDrawing() pour effectuer les dessins 2D
; On dimensionne la matrice qui servira de masque
Dim Zone.f(2 * (rx + 1), 2 * (ry + 1))
StartDrawing(OutputID)
; On définit les pixel qui doivent être colorés avec un coefficient d'application (pour le lissage)
For n = 0 To rx * ry
angle.f = 3.141593 * n / (rx * ry * 2) ; Angle
x.f = rx * Cos(angle) ; Position réelle en x
y.f = ry * Sin(angle) ; Position réelle en y
xx.l = Int(x + 0.5) ; Position approximée de x
yy.l = Int(y + 0.5) ; Position approximée de y
For dx = -1 To 1 ; On se déplace autour du point aproximée
For dy = -1 To 1
CoefX.f = 1 - Abs(x - xx - dx) ; On calcul la différence entre le point réel et le point approximé + déplacement
CoefY.f = 1 - Abs(y - yy - dy)
If CoefX > 0 And CoefY > 0 ; Si les coefficient partiel sont positif
Coef.f = Pow(CoefX * CoefY, Lumiere) ; on calcul le coefficient à appliquer pour répartir la couleur du point sur plusieurs pixels
Else ; Sinon le point ne doit pas contenir de couleur
Coef.f = 0
EndIf
If Coef > Zone(xx + dx + rx + 1, yy + dy + ry + 1)
; On ne dessine qu'un quart du cercle que l'on duplique par symétrie
Zone(rx + 1 + (xx + dx), ry + 1 + (yy + dy)) = coef
Zone(rx + 1 - (xx + dx), ry + 1 + (yy + dy)) = coef
Zone(rx + 1 + (xx + dx), ry + 1 - (yy + dy)) = coef
Zone(rx + 1 - (xx + dx), ry + 1 - (yy + dy)) = coef
EndIf
Next
Next
Next
For dx = 1 To 2 * rx + 1
For dy = 1 To 2 * ry + 1
If Zone(dx, dy) > 0 ; Si le point est coloré
Couleur_origine = Point(cx - rx - 1 + dx, cy - ry - 1 + dy) ; On regarde la couleur d'origine
Rouge.l = Int((1 - Zone(dx, dy)) * Red(Couleur_origine) + Zone(dx, dy) * Red(Couleur)) ; On fusionne la couleur du cercle avec la couleur du fond
Vert.l = Int((1 - Zone(dx, dy)) * Green(Couleur_origine) + Zone(dx, dy) * Green(Couleur))
Bleu.l = Int((1 - Zone(dx, dy)) * Blue(Couleur_origine) + Zone(dx, dy) * Blue(Couleur))
Plot(cx - rx - 1 + dx, cy - ry - 1 + dy, RGB(Rouge, Vert, Bleu)) ; On dessine le nouveau point
EndIf
Next
Next
StopDrawing()
EndProcedure
;- Test
OpenWindow(0, 0, 0, 400, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Cercle")
CreateGadgetList(WindowID())
; On crée une image
CreateImage(0, 400, 400)
; On réalise un décor sur l'image
StartDrawing(ImageOutput())
For n = 0 To 200
Line(0, n, 400, 0, RGB(n, 0, 0)) ; dégradé rouge
Line(0, 400 - n, 400, 0, RGB(n, n, n)) ; dégradé gris
Next
Box(300, 150, 100, 100, $FFFFFF)
StopDrawing()
; On dessine des cercles
Cercle(200, 200, 150, 190, $FFFFFF, 1/2, ImageOutput()) ; Ellipse blanche
Cercle(120, 200, 100, 100, $C800, 1/2, ImageOutput()) ; Cercle vert
Cercle(350, 200, 40, 30, 0, 1, ImageOutput()) ; Ellipse noire
Cercle(350, 200, 20, 20, $7A7A7A, 0.8, ImageOutput()) ; Cercle gris
; On affiche l'image
ImageGadget(0, 0, 0, 400, 400, UseImage(0))
Repeat
Event = WaitWindowEvent()
Until Event = #WM_CLOSE