Publié : mer. 01/sept./2004 23:01
...
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
On a pas dû fréquenter la même maternellecrisot a écrit :Le tore est du niveau maternelle