Page 2 sur 3

Publié : mer. 01/sept./2004 23:01
par Psycode
...

Publié : jeu. 02/sept./2004 2:07
par garzul
:D 8O Siderant vraiment génial heu tu peux m'apprendre a faire sa steuplé 8O j'en reste ebahis 8O

Publié : jeu. 02/sept./2004 14:00
par Dr. Dri
super ^^
j'adooooore !

l'exe "cristot" ne marche pas chez moi :(
sinon ca rame à mort ^^ (jte parle meme pas de la version alpha lol)

Dri :10:

Publié : jeu. 02/sept./2004 14:51
par Psycode
...

Publié : jeu. 02/sept./2004 18:36
par crisot
C moi qu'à codé le torus :-D gnagnagna :)

Publié : jeu. 02/sept./2004 19:04
par comtois
c'est beau , c'est super ,mais ils sont où les sources ?

Publié : jeu. 02/sept./2004 19:48
par crisot
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.


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

Publié : jeu. 02/sept./2004 19:54
par garzul
:D Cool je vais etudier cela (Noter une nette amélioration de mon écriture :lol: )

Publié : jeu. 02/sept./2004 20:47
par comtois
crisot a écrit :Le tore est du niveau maternelle
On a pas dû fréquenter la même maternelle :)

Sympa ce code ,merci de partager :wink: .

Publié : jeu. 02/sept./2004 20:52
par Psycode
...

Publié : ven. 03/sept./2004 7:14
par Dr. Dri
marche pas non plus le 1024 :(

Dri

Publié : dim. 05/sept./2004 13:27
par Dr. Dri
maintenant ta source fonctionne crisot :s
enfin c'est tant mieux ^^ elle rame moins ke les exe k'il y avait à dl

et pourquoi tous les messages de psycode sont devenus des "..." ??

Dri

Publié : dim. 05/sept./2004 13:35
par Chris
Parce qu'il les a effacés, tout simplement :lol:

http://purebasic.hmt-forum.com/viewtopic.php?t=1398

Publié : dim. 05/sept./2004 13:48
par nico
C'est simple, c'est parce que "..."

Ben si tu avais tout suivi, tu saurais que ça s'appelle de la susceptibilité suite à un message de "..." , c'est toujours comme ça que ça se passe!

Affaire à suivre...

:)

Publié : dim. 05/sept./2004 17:13
par Dr. Dri
nan j'avais pas suivi ce topic... les 3 premiers posts uniquement

Dri