Code : Tout sélectionner
; Auteur : SPH (francais (51100 reims))
; Routine de tracé de triangles pleins avec ou sans dégradé et bordure
Procedure SPH_Triangle(x1, y1, x2, y2, x3, y3, couleur1, couleur2, couleur3, alpha.f, mode, lum, trou, deplacement)
rec = 0
If y1 = y2 : y1 + 1 : rec = 1: EndIf
If y1 = y3 : y1 + 1 : rec = 1: EndIf
If y2 = y3 : y2 + 1 : rec = 2: EndIf
haut = y1
xx.f = x1
xy.f = y1
xdeb.f = x2
ydeb.f = y2
xfin.f = x3
yfin.f = y3
plat = 0
If x1=x2 And y1=y2
plat = 1
EndIf
If x1=x3 And y1=y3
plat = 1
EndIf
If x2=x3 And y2=y3
plat = 1
EndIf
If x1=x2 And x2=x3
plat = 1
EndIf
If y1=y2 And y2=y3
plat = 1
EndIf
If plat = 1 : ProcedureReturn 0 : EndIf
If y2<haut : ydeb = xy : xdeb= xx : haut = y2 : xx= x2 :xy=y2 : EndIf
If y3<haut : yfin = xy : xfin= xx: haut = y3 : xx= x3 : xy=y3 : EndIf
If xdeb>xfin
u=xdeb : xdeb=xfin : xfin=u
u=ydeb : ydeb=yfin : yfin=u
EndIf
bas = y1
If y2>bas : bas = y2 : EndIf
If y3>bas : bas = y3 : EndIf
deca.f=0
decb.f=0
decc.f=0
u = ydeb-haut : If u=0 : u=1 : EndIf
dec1.f = (xx-xdeb)/u
u = yfin-haut : If u=0 : u=1 : EndIf
dec2.f = (xfin-xx)/u
u = yfin-ydeb : If u=0 : dec3.f = 0 : milieuy = bas +1
Else : dec3.f = (xfin-xdeb)/u
milieuy = ydeb : xx01= 1
If milieuy > yfin : milieuy = yfin : xx01= 2 : EndIf
EndIf
Dim rvb(8)
rvb(0)= Red(couleur1)
rvb(1)= Red(couleur2)
rvb(2)= Red(couleur3)
rvb(3)= Green(couleur1)
rvb(4)= Green(couleur2)
rvb(5)= Green(couleur3)
rvb(6)= Blue(couleur1)
rvb(7)= Blue(couleur2)
rvb(8)= Blue(couleur3)
If rec=1 : y1-1 : EndIf
If rec=2 : y2-1 : EndIf
dist12.f = Sqr((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
dist23.f = Sqr((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))
dist13.f = Sqr((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1))
;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
For u = haut To bas
If decb+deca>0
For n = xx-deca To xx+decb
dist1.f = Sqr((n-x1)*(n-x1)+(u-y1)*(u-y1))
dist2.f = Sqr((n-x2)*(n-x2)+(u-y2)*(u-y2))
dist3.f = Sqr((n-x3)*(n-x3)+(u-y3)*(u-y3))
If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf
If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf
If mode = 2
distM1.f = (dist12.f+dist13.f)/2
distM2.f = (dist12.f+dist23.f)/2
distM3.f = (dist13.f+dist23.f)/2
EndIf
If mode = 3
distM1.f = dist12.f
If distM1.f<dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f
If distM2.f<dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f
If distM3.f<dist23.f : distM3.f = dist23.f : EndIf
EndIf
If mode = 4
distM1.f = dist12.f*1.3
If distM1.f<dist13.f*1.3 : distM1.f = dist13.f*1.3 : EndIf
distM2.f = dist12.f*1.3
If distM2.f<dist23.f*1.3 : distM2.f = dist23.f*1.3 : EndIf
distM3.f = dist13.f*1.3
If distM3.f<dist23.f*1.3 : distM3.f = dist23.f*1.3 : EndIf
EndIf
r1.f= lum - ((dist1/(distM1))*100)
r2.f= lum - ((dist2/(distM2))*100)
r3.f= lum - ((dist3/(distM3))*100)
v1.f= lum - ((dist1/(distM1))*100)
v2.f= lum - ((dist2/(distM2))*100)
v3.f= lum - ((dist3/(distM3))*100)
b1.f= lum - ((dist1/(distM1))*100)
b2.f= lum - ((dist2/(distM2))*100)
b3.f= lum - ((dist3/(distM3))*100)
rr4.f= (rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f= (rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f= (rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)
If alpha<100
c = Point(n,u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4+rr5
vv4+vv5
bb4+bb5
EndIf
EndIf
If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf
If trou=0 And deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
If Random(trou) = 0
If deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
Plot (n+Random(deplacement*2)-deplacement,u+Random(deplacement*2)-deplacement,RGB(rr4,vv4,bb4))
EndIf
EndIf
EndIf
Next
Else
For n = xx-deca To xx+decb Step -1
;;;
dist1.f = Sqr((n-x1)*(n-x1)+(u-y1)*(u-y1))
dist2.f = Sqr((n-x2)*(n-x2)+(u-y2)*(u-y2))
dist3.f = Sqr((n-x3)*(n-x3)+(u-y3)*(u-y3))
If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf
If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf
If mode = 2
distM1.f = (dist12.f+dist13.f)/2
distM2.f = (dist12.f+dist23.f)/2
distM3.f = (dist13.f+dist23.f)/2
EndIf
If mode = 3
distM1.f = dist12.f
If distM1.f<dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f
If distM2.f<dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f
If distM3.f<dist23.f : distM3.f = dist23.f : EndIf
EndIf
If mode = 4
distM1.f = dist12.f*1.3
If distM1.f<dist13.f*1.3 : distM1.f = dist13.f*1.3 : EndIf
distM2.f = dist12.f*1.3
If distM2.f<dist23.f*1.3 : distM2.f = dist23.f*1.3 : EndIf
distM3.f = dist13.f*1.3
If distM3.f<dist23.f*1.3 : distM3.f = dist23.f*1.3 : EndIf
EndIf
r1.f= lum - ((dist1/(distM1))*100)
r2.f= lum - ((dist2/(distM2))*100)
r3.f= lum - ((dist3/(distM3))*100)
v1.f= lum - ((dist1/(distM1))*100)
v2.f= lum - ((dist2/(distM2))*100)
v3.f= lum - ((dist3/(distM3))*100)
b1.f= lum - ((dist1/(distM1))*100)
b2.f= lum - ((dist2/(distM2))*100)
b3.f= lum - ((dist3/(distM3))*100)
rr4.f= (rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f= (rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f= (rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)
If alpha<100
c = Point(n,u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4+rr5
vv4+vv5
bb4+bb5
EndIf
EndIf
If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf
If trou=0 And deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
If Random(trou) = 0
If deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
Plot (n+Random(deplacement*2)-deplacement,u+Random(deplacement*2)-deplacement,RGB(rr4,vv4,bb4))
EndIf
EndIf
EndIf
Next
;;;
EndIf
;pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
If u < milieuy
deca + dec1
decb + dec2
EndIf
If u > milieuy
If xx01 = 1
deca - dec3
decb + dec2
Else
deca + dec1
decb + dec3
EndIf
EndIf
Next
; LineXY(x1,y1,x2,y2,1500000)
; LineXY(x1,y1,x3,y3,1500000)
; LineXY(x2,y2,x3,y3,1500000)
EndProcedure
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
;- Debut du programme
OpenWindow(1, 0, 0, 1024, 768, #PB_Window_MinimizeGadget, "")
If StartDrawing(WindowOutput())
; un fond pour tester l'alpha (mettre un alpha different de 100) :
;For i = 1 To 15 : Box(Random (639),Random (499),Random (639),Random (499), RGB(Random (255),Random (255),Random (255))) : Next
StopDrawing()
EndIf
For plusieur = 1 To 10
; Toutes les lignes du dessous jusqu'a la ligne de commentaire avec plein de Z peuvent
; etre effacé pour que l'utilisation mette ses propres valeurs !
lumiere = 100
alpha = 100 ;(mettez 1 ou 2, c'est rigolo...)
mode = 1
trou=1 ; (de 0 a 10 (+ en fait mais aucun interet))
deplacement=0 ; un espece de BLUR (ATTENTION, certains points risquent de sortir (= bug))) ps: ici, la marge est de 29 ou 30
; is deplacement <> 0 alors ca rame un peu
x1 = Random(992) +30
y1 = Random(733) +30
x2 = Random(992) +30
y2 = Random(733) +30
x3 = Random(992) +30
y3 = Random(733) +30
c1= RGB(Random(255),Random(255),Random(255))
c2= RGB(Random(255),Random(255),Random(255))
c3= RGB(Random(255),Random(255),Random(255))
; ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
If StartDrawing(WindowOutput())
SPH_Triangle(x1, y1, x2, y2, x3, y3, c1, c2, c3, alpha, mode, lumiere, trou, deplacement)
;--------------- A --- --- L --- I --- R --- E ------------------
; alpha, c'est l'alpha (de 0 (transparent total) a 100(pas transparent))
; mode va de 0 a 4 (0=dark et 4=pastel)
; lumiere va de 50 a 150 (lumiere neutre = 100)
; pour que tu puisse voir chaque triangle :
;Delay (1500)
;------------------------------------------------------------------------------
StopDrawing()
EndIf
Next
Repeat : event = WindowEvent() : Until event=#PB_Event_CloseWindow