
C'est volontairement non optimisé pour une lisibilité maxi, bien que ça manque encore un peu d'ordre



Code : Tout sélectionner
;* Initialisation de DirectX *;
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
End
EndIf
;* Ouverture de la l'écran *;
OpenScreen(640,480,32,"")
;* definition de quelques valeurs, et des coordonnées des points *;
Dim PX2(5) : Dim PY2(5) : Dim PZ2(5)
Dim PX3(5) : Dim PY3(5) : Dim PZ3(5) : Dim ink(5)
PX3(0)=150 : PY3(0)=0 : PZ3(0)=0
PX3(1)=-150 : PY3(1)=0 : PZ3(1)=0
PX3(2)=0 : PY3(2)=0 : PZ3(2)=150
PX3(3)=0 : PY3(3)=0 : PZ3(3)=-150
PX3(4)=0 : PY3(4)=150 : PZ3(4)=0
PX3(5)=0 : PY3(5)=-150 : PZ3(5)=0
angx.f=0 : angy.f=0 : angz.f=0
;* boucle principale *;
Repeat
ClearScreen(255, 255, 255)
;* mise en place des couleurs *;
ink(0)= 255*65536 + 000*256 + 000
ink(1)= 255*65536 + 255*256 + 000
ink(2)= 000*65536 + 255*256 + 000
ink(3)= 000*65536 + 255*256 + 255
ink(4)= 000*65536 + 000*256 + 255
ink(5)= 255*65536 + 000*256 + 255
;* rotation et projection des points, non optimisée mais compréhensible *;
For u=0 To 5
x0=PX3(u)
y0=PY3(u)
z0=PZ3(u)
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-256)+320
y4=(y3*256)/(z3-256)+240
PX2(u)=x4
PY2(u)=y4
PZ2(u)=z3
Next
;* tri à pivot: lent mais suffisant dans notre cas *;
Repeat
change=0
For u=0 To 4
za=PZ2(u)
zb=PZ2(u+1)
If zb<za
x=px2(u) : px2(u)=px2(u+1) : px2(u+1)=x
y=py2(u) : py2(u)=py2(u+1) : py2(u+1)=Y
pz2(u)=zb : pz2(u+1)=za
in=ink(u) : ink(u)=ink(u+1) : ink(u+1)=in
change=1
EndIf
Next
Until change=0
;* traçage *;
StartDrawing(ScreenOutput())
For u=0 To 5
posx=PX2(u) : posy=PY2(u) : posz=(PZ2(u)+256)/2.3 : ink=ink(u)
posy=posy-posz
sizex=posz*posz : sizey=posz*2
hy.f=(180/sizey)/57.297795
For n=0 To sizey-1
ang.f=n*hy
x=Sqr(Sin(ang)*sizex)
LineXY(posx+x,posy+n,posx-x,posy+n,ink)
Next
Next
angx+0.0743
angy+0.023
angz-0.0345
StopDrawing()
FlipBuffers()
;* On quite ! *;
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End