Dessiner un triangle rempli

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Psycode
Messages : 131
Inscription : lun. 23/août/2004 18:47
Localisation : Jupiter ?

Message par Psycode »

...
Dernière modification par Psycode le ven. 03/sept./2004 17:34, modifié 1 fois.
Wait And See...
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D 8O Siderant vraiment génial heu tu peux m'apprendre a faire sa steuplé 8O j'en reste ebahis 8O
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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:
Psycode
Messages : 131
Inscription : lun. 23/août/2004 18:47
Localisation : Jupiter ?

Message par Psycode »

...
Dernière modification par Psycode le ven. 03/sept./2004 17:35, modifié 1 fois.
Wait And See...
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Message par crisot »

C moi qu'à codé le torus :-D gnagnagna :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

c'est beau , c'est super ,mais ils sont où les sources ?
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Message 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
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D Cool je vais etudier cela (Noter une nette amélioration de mon écriture :lol: )
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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: .
Psycode
Messages : 131
Inscription : lun. 23/août/2004 18:47
Localisation : Jupiter ?

Message par Psycode »

...
Dernière modification par Psycode le ven. 03/sept./2004 17:35, modifié 1 fois.
Wait And See...
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

marche pas non plus le 1024 :(

Dri
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Parce qu'il les a effacés, tout simplement :lol:

http://purebasic.hmt-forum.com/viewtopic.php?t=1398
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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...

:)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

nan j'avais pas suivi ce topic... les 3 premiers posts uniquement

Dri
Répondre