Dessiner un triangle rempli
Ici 
Bon, le tracé de polygon n'est pas optimal et ne gère pas les sorties d'écran, y'a plus rapide.
Le tore est du niveau maternelle, mais au moins on doit pouvoir comprendre comment il marche.
Bref, vla quoi.

Bon, le tracé de polygon n'est pas optimal et ne gère pas les sorties d'écran, y'a plus rapide.
Le tore est du niveau maternelle, mais au moins on doit pouvoir comprendre comment il marche.
Bref, vla quoi.
Code : Tout sélectionner
Procedure Polygon (X0,Y0,R0,G0,B0, X1,Y1,R1,G1,B1, X2,Y2,R2,G2,B2)
;* Recherche du point le plus haut et le plus bat *;
T=Y0 : B=Y0 : CAS=0
If Y1<T : T=Y1 : CAS=1 : EndIf : If Y1>B : B=Y1 : EndIf
If Y2<T : T=Y2 : CAS=2 : EndIf : If Y2>B : B=Y2 : EndIf
;* Calcul des pentes dans les 3 cas possibles *;
If CAS=0
XA.f=X0 : XB.f=X0 : RA.f=R0 : RB.f=R0 : GA.f=G0 : GB.f=G0 : BA.f=B0 : BB.f=B0
XA1.f = (X1-X0)/(Y1-Y0) : XB1.f = (X2-X0)/(Y2-Y0) : XC1.f = (X2-X1)/(Y2-Y1)
RA1.f = (R1-R0)/(Y1-Y0) : RB1.f = (R2-R0)/(Y2-Y0) : RC1.f = (R2-R1)/(Y2-Y1)
GA1.f = (G1-G0)/(Y1-Y0) : GB1.f = (G2-G0)/(Y2-Y0) : GC1.f = (G2-G1)/(Y2-Y1)
BA1.f = (B1-B0)/(Y1-Y0) : BB1.f = (B2-B0)/(Y2-Y0) : BC1.f = (B2-B1)/(Y2-Y1)
If Y1<Y2 : HALF=Y1
XA2.f=XC1 : XB2.f=XB1 : RA2.f=RC1 : RB2.f=RB1 : GA2.f=GC1 : GB2.f=GB1 : BA2.f=BC1 : BB2.f=BB1
Else : HALF=Y2
XA2.f=XA1 : XB2.f=XC1 : RA2.f=RA1 : RB2.f=RC1 : GA2.f=GA1 : GB2.f=GC1 : BA2.f=BA1 : BB2.f=BC1
EndIf
If Y0=Y1 : XA = X1 : RA=R1 : GA=G1 : BA=B1 : EndIf ;* cas particulier à ne pas oublier *;
If Y0=Y2 : XB = X2 : RB=R2 : GB=G2 : BB=B2 : EndIf ;* cas particulier à ne pas oublier *;
EndIf
If CAS=1
XA.f=X1 : XB.f=X1 : RA.f=R1 : RB.f=R1 : GA.f=G1 : GB.f=G1 : BA.f=B1 : BB.f=B1
XA1.f = (X2-X1)/(Y2-Y1) : XB1.f = (X0-X1)/(Y0-Y1) : XC1.f = (X0-X2)/(Y0-Y2)
RA1.f = (R2-R1)/(Y2-Y1) : RB1.f = (R0-R1)/(Y0-Y1) : RC1.f = (R0-R2)/(Y0-Y2)
GA1.f = (G2-G1)/(Y2-Y1) : GB1.f = (G0-G1)/(Y0-Y1) : GC1.f = (G0-G2)/(Y0-Y2)
BA1.f = (B2-B1)/(Y2-Y1) : BB1.f = (B0-B1)/(Y0-Y1) : BC1.f = (B0-B2)/(Y0-Y2)
If Y2<Y0 : HALF=Y2
XA2.f=XC1 : XB2.f=XB1 : RA2.f=RC1 : RB2.f=RB1 : GA2.f=GC1 : GB2.f=GB1 : BA2.f=BC1 : BB2.f=BB1
Else : HALF=Y0
XA2.f=XA1 : XB2.f=XC1 : RA2.f=RA1 : RB2.f=RC1 : GA2.f=GA1 : GB2.f=GC1 : BA2.f=BA1 : BB2.f=BC1
EndIf
If Y1=Y2 : XA = X2 : RA=R2 : GA=G2 : BA=B2 : EndIf ;* cas particulier à ne pas oublier *;
If Y1=Y0 : XB = X0 : RB=R0 : GB=G0 : BB=B0 : EndIf ;* cas particulier à ne pas oublier *;
EndIf
If CAS=2
XA.f=X2 : XB.f=X2 : RA.f=R2 : RB.f=R2 : GA.f=G2 : GB.f=G2 : BA.f=B2 : BB.f=B2
XA1.f = (X0-X2)/(Y0-Y2) : XB1.f = (X1-X2)/(Y1-Y2) : XC1.f = (X1-X0)/(Y1-Y0)
RA1.f = (R0-R2)/(Y0-Y2) : RB1.f = (R1-R2)/(Y1-Y2) : RC1.f = (R1-R0)/(Y1-Y0)
GA1.f = (G0-G2)/(Y0-Y2) : GB1.f = (G1-G2)/(Y1-Y2) : GC1.f = (G1-G0)/(Y1-Y0)
BA1.f = (B0-B2)/(Y0-Y2) : BB1.f = (B1-B2)/(Y1-Y2) : BC1.f = (B1-B0)/(Y1-Y0)
If Y0<Y1 : HALF=Y0
XA2.f=XC1 : XB2.f=XB1 : RA2.f=RC1 : RB2.f=RB1 : GA2.f=GC1 : GB2.f=GB1 : BA2.f=BC1 : BB2.f=BB1
Else : HALF=Y1
XA2.f=XA1 : XB2.f=XC1 : RA2.f=RA1 : RB2.f=RC1 : GA2.f=GA1 : GB2.f=GC1 : BA2.f=BA1 : BB2.f=BC1
EndIf
If Y2=Y0 : XA = X0 : RA=R0 : GA=G0 : BA=B0 : EndIf ;* cas particulier à ne pas oublier *;
If Y2=Y1 : XB = X1 : RB=R1 : GB=G1 : BB=B1 : EndIf ;* cas particulier à ne pas oublier *;
EndIf
If XA1>XB1
zz.f=XA : XA=XB : XB=zz
zz.f=RA : RA=RB : RB=zz
zz.f=GA : GA=GB : GB=zz
zz.f=BA : BA=BB : BB=zz
zz.f=XA1 : XA1=XB1 : XB1=zz
zz.f=RA1 : RA1=RB1 : RB1=zz
zz.f=GA1 : GA1=GB1 : GB1=zz
zz.f=BA1 : BA1=BB1 : BB1=zz
zz.f=XA2 : XA2=XB2 : XB2=zz
zz.f=RA2 : RA2=RB2 : RB2=zz
zz.f=GA2 : GA2=GB2 : GB2=zz
zz.f=BA2 : BA2=BB2 : BB2=zz
EndIf
;* Traçage *;
For i=T To HALF-1
XAd=XA : XBd=XB : RAf.f=RA : GAf.f=GA : BAf.f=BA : len.f=XB-XA
RBf.f=(RB-RA)/len : GBf.f=(GB-GA)/len : BBf.f=(BB-BA)/len
For n=XAd To XBd
Plot(n, i, RGB(RAf,GAf,BAf))
RAf+RBf : GAf+GBf : BAf+BBf
Next
XA+XA1 : XB+XB1 : RA+RA1 : RB+RB1 : GA+GA1 : GB+GB1 : BA+BA1 : BB+BB1
Next
For i=HALF To B
XAd=XA : XBd=XB: RAf.f=RA : GAf.f=GA : BAf.f=BA : len.f=XB-XA
RBf.f=(RB-RA)/len : GBf.f=(GB-GA)/len : BBf.f=(BB-BA)/len
For n=XAd To XBd
Plot(n, i, RGB(RAf,GAf,BAf))
RAf=RAf+RBf : GAf=GAf+GBf : BAf=BAf+BBf
Next
XA+XA2 : XB+XB2 : RA+RA2 : RB+RB2 : GA+GA2 : GB+GB2 : BA+BA2 : BB+BB2
Next
EndProcedure
;* Initialisation de DirectX *;
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
End
EndIf
;* Ouverture de l'écran *;
OpenScreen(640, 480, 32, "")
;* Quelques tableau, et une valeur 2PI pour la conversion radian/degree *;
_2pi.f=3.14159265*2
angx.f : angy.f : angz.f
Dim _3D(500,5) : Dim _2D(500,3) : Dim link(500,3)
;* Creation X Y Z R G B du tore *;
adr=0
For u=0 To 19
au.f=u*18*(_2pi/360)
For n=0 To 9
an.f=(n*36+90)*(_2pi/360)
_3D(adr,0)=(Cos(an)*41+123)*Cos(au) ;* X *;
_3D(adr,1)=Sin(an)*41 ;* Y *;
_3D(adr,2)=(Cos(an)*41+123)*Sin(au) ;* Z *;
_3D(adr,3)=Random(255) ;* R *;
_3D(adr,4)=Random(255) ;* G *;
_3D(adr,5)=Random(255) ;* B *;
adr+1
Next
Next
;* table des points à joindre pour afficher des polygons *;
;* ici le tore est composé de polygons à 4 cotés uniquement *;
adr=0
For u=0 To 9
uu=u+1 : If uu=10 : uu=0 : EndIf
For n=0 To 19
nn=n+1 : If nn=20 : nn=0 : EndIf
link(adr,0)=n*10+u ;* point 1 *;
link(adr,1)=nn*10+u ;* point 2 *;
link(adr,2)=nn*10+uu ;* point 3 *;
link(adr,3)=n*10+uu ;* point 4 *;
adr+1
Next
Next
;* boucle principale *;
Repeat
ClearScreen(0, 0, 0)
StartDrawing(ScreenOutput())
;* rotation et projection des points, non optimisée mais compréhensible *;
For u=0 To 199
x0=_3D(u,0)
y0=_3D(u,1)
z0=_3D(u,2)
x1=x0
y1=Cos(angx)*y0+Sin(angx)*z0
z1=-Sin(angx)*y0+Cos(angx)*z0
x2=Cos(angy)*x1-Sin(angy)*z1
y2=y1
z2=Sin(angy)*x1+Cos(angy)*z1
x3=Cos(angz)*x2+Sin(angz)*y2
y3=-Sin(angz)*x2+Cos(angz)*y2
z3=z2
x4=(x3*256)/(z3+250)+320
y4=(y3*256)/(z3+250)+240
_2D(u,0)=x4
_2D(u,1)=y4
_2D(u,2)=z3
Next
;* affichage d'un polygon à 4 coté (en 2 triangles, forcément) *;
For n=0 To 199
point0=link(n,0) : point1=link(n,1) : point2=link(n,2) : point3=link(n,3)
X0=_2D(point0,0) : Y0=_2D(point0,1) : R0=_3D(point0,3) : G0=_3D(point0,4) : B0=_3D(point0,5)
X1=_2D(point1,0) : Y1=_2D(point1,1) : R1=_3D(point1,3) : G1=_3D(point1,4) : B1=_3D(point1,5)
X2=_2D(point2,0) : Y2=_2D(point2,1) : R2=_3D(point2,3) : G2=_3D(point2,4) : B2=_3D(point2,5)
X3=_2D(point3,0) : Y3=_2D(point3,1) : R3=_3D(point3,3) : G3=_3D(point3,4) : B3=_3D(point3,5)
vec.f=(X1-X0)*(Y2-Y0)-(X2-X0)*(Y1-Y0)
If vec>0
Polygon (X0,Y0,R0,G0,B0, X1,Y1,R1,G1,B1, X2,Y2,R2,G2,B2)
EndIf
vec.f=(X2-X0)*(Y3-Y0)-(X3-X0)*(Y2-Y0)
If vec>0
Polygon (X0,Y0,R0,G0,B0, X2,Y2,R2,G2,B2, X3,Y3,R3,G3,B3)
EndIf
Next
;* fini, on passe à l'image suivante *;
angx+0.05
angy+0.076
angz+0.032
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End