Dessiner un triangle rempli

Partagez votre expérience de PureBasic avec les autres utilisateurs.
TersaKen
Messages : 58
Inscription : dim. 05/févr./2006 16:15

Message par TersaKen »

Voici ma solution :P

Code : Tout sélectionner

Procedure Triangle(ax1,ay1,ax2,ay2,ax3,ay3,r,g,b)



  If ax1 =< ax2 And ax1 =< ax3
   x1 = ax1
   y1 = ay1
   If ax2 =< ax3
    x2 = ax2 : y2 = ay2
    x3 = ax3 : y3 = ay3
   Else
    x2 = ax3 : y2 = ay3
    x3 = ax2 : y3 = ay2
   EndIf
  EndIf  
  
  If ax2 =< ax1 And ax2 =< ax3
   x1 = ax2
   y1 = ay2
   If ax1 =< ax3
    x2 = ax1 : y2 = ay1
    x3 = ax3 : y3 = ay3
   Else      
    x2 = ax3 : y2 = ay3
    x3 = ax1 : y3 = ay1
   EndIf    
  EndIf 
  
  If ax3 =< ax1 And ax3 =< ax2
   x1 = ax3
   y1 = ay3
   If ax2 =< ax1
    x2 = ax2 : y2 = ay2
    x3 = ax1 : y3 = ay1
   Else      
    x2 = ax1 : y2 = ay1
    x3 = ax2 : y3 = ay2
   EndIf    
  EndIf 
  
   

 
  
     xdepart.f = x1
     ydepart.f = y1
     yfin.f    = y1
     
     Coeff_A.f = ( y2-y1 ) / (x2-x1 )
     Coeff_B.f = ( y3-y1 ) / (x3-x1 )
     
        
    
     If x2 < x3   
        Pt_Ct = x2 : fin = x3 : fin2 = y3
        Coeff_C.f = -1*( y3-y2 ) / (x3-x2 )  
        Coeff_D.f = -1*Coeff_B.f 
       Else  
        Pt_Ct = x3 : fin = x2 : fin2 = y2
        Coeff_C.f = -1*( y2-y3 ) / (x2-x3 ) 
        Coeff_D.f = -1*Coeff_A.f
      EndIf
     

  
      If Coeff_A.f < Coeff_B.f 
          Coeff_Down.f = Coeff_A.f
          Coeff_Up.f   = Coeff_B.f 
      Else
          Coeff_Down.f = Coeff_B.f
          Coeff_Up.f   = Coeff_A.f
      EndIf 

   For x = xdepart.f To Pt_Ct Step 1
         y = ydepart.f
         Repeat 
            y = y+1 
            Plot( x,y,RGB(r,g,b) )
         Until y >= yfin.f

        ydepart.f = ydepart.f+Coeff_Down.f
        yfin.f    = yfin.f+Coeff_Up.f 

   
   Next x
   
   
   ;*********************************************************************
   
  If Coeff_C.f < Coeff_D.f 
      Coeff_Down.f = Coeff_C.f
      Coeff_Up.f   = Coeff_D.f 
  Else
      Coeff_Down.f = Coeff_D.f
      Coeff_Up.f   = Coeff_C.f
  EndIf  
  
  ydepart.f = fin2
  yfin.f    = fin2
   
 
       For x = fin To Pt_Ct Step -1
          y = ydepart.f
          Repeat 
             y = y+1             
             Plot( x,y,RGB(r,g,b))
          Until y >= yfin.f
         ydepart.f = ydepart.f+Coeff_Down.f
         yfin.f    = yfin.f+Coeff_Up.f 
    Next x
   
   
   
   
EndProcedure 
Un code plutot longuet, mais rapide a l'execution !

[ edit ; ce code fonctionne avec des points et serait plus rapide avec des lignes, mais cependant pour des besoins personnels, il m'était necessaire d''utiliser la commande Plot(x,y) ]
Anonyme

Message par Anonyme »

je viens de tester ta fonction de remplisage de triangle, elle rame lors de l'affichage d'objet un peu plus complexe qu'un cube.
J'ai utilisé le canard le plus connu du monde ^^
Sinon , bon boulot, je vais l'optimiser.
@+
TersaKen
Messages : 58
Inscription : dim. 05/févr./2006 16:15

Message par TersaKen »

ça serait plus rapide si on utilisait " LineXY " entre les deux etremités, qu'une suite de point.
barnierchristophe
Messages : 64
Inscription : lun. 07/févr./2005 11:18

Message par barnierchristophe »

Voilà une procedure pour remplir un polygone à n points:

Code : Tout sélectionner

 win=OpenWindow(0,0,0,640,480,#PB_Window_ScreenCentered,"3D")
Red=RGB(255,0,0)
Green=RGB(0,255,0)
Blue=RGB(0,0,255)
yellow=RGB(255,255,0)
Magenta=RGB(255,0,255)
Cyan=RGB(0,255,255)
White=RGB(255,255,255)
black=RGB(0,0,0)
gris=RGB(128,128,128)

Procedure RempliPolygone(Device.l,Mem.l,NbrePoint.l,Couleur.l)
  brush=CreateSolidBrush_(Couleur)
  pen=CreatePen_(PS_SOLID,0,Couleur)	
  SelectObject_(Device,brush)
  SelectObject_(Device,pen)
  Polygon_(Device,Mem,NbrePoint)
EndProcedure

Dim testp.l(10)
Dim testt.l(10)
testp(0)=100 : testp(1)=100
testp(2)=300 : testp(3)=200
testp(4)=400 : testp(5)=400
testp(6)=100 : testp(7)=300
testt(0)=0 : testt(1)=200
testt(2)=500 : testt(3)=100
testt(4)=300 : testt(5)=300

DC = StartDrawing(WindowOutput())
RempliPolygone(DC,@testp(),4,Red)
RempliPolygone(DC,@testt(),3,Blue)

StopDrawing()

Repeat : Until WaitWindowEvent()=#WM_CHAR 
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

En utilisant le GDI c'est un peu facile :P

Dri
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Code : Tout sélectionner

; Auteur : SPH (francais (51100 reims)) 
; Routine de tracé de triangles pleins avec ou sans dégradé et bordure 

Procedure SPH_Triangle(x1, y1, x2, y2, x3, y3, couleur1, couleur2, couleur3, alpha.f, mode,lum)
rec = 0 
If y1 = y2 : y1 + 1 : rec = 1: EndIf 
If y1 = y3 : y1 + 1 : rec = 1: EndIf 
If y2 = y3 : y2 + 1 : rec = 2: EndIf 

haut = y1 
xx.f = x1 
xy.f = y1 
xdeb.f = x2 
ydeb.f = y2 
xfin.f = x3 
yfin.f = y3 
plat = 0 

If x1=x2 And y1=y2 
plat = 1 
EndIf 
If x1=x3 And y1=y3 
plat = 1 
EndIf 
If x2=x3 And y2=y3 
plat = 1 
EndIf 
If x1=x2 And x2=x3 
plat = 1 
EndIf 
If y1=y2 And y2=y3 
plat = 1 
EndIf 
If plat = 1 : ProcedureReturn 0 : EndIf 

If y2<haut : ydeb = xy : xdeb= xx : haut = y2 : xx= x2 :xy=y2 : EndIf 
If y3<haut : yfin = xy : xfin= xx: haut = y3 : xx= x3 : xy=y3 : EndIf 


If xdeb>xfin 
u=xdeb : xdeb=xfin : xfin=u 
u=ydeb : ydeb=yfin : yfin=u 
EndIf 

bas = y1 
If y2>bas : bas = y2 : EndIf 
If y3>bas : bas = y3 : EndIf 

deca.f=0 
decb.f=0 
decc.f=0 

u = ydeb-haut : If u=0 : u=1 : EndIf 
dec1.f = (xx-xdeb)/u 
u = yfin-haut : If u=0 : u=1 : EndIf 
dec2.f = (xfin-xx)/u 
u = yfin-ydeb : If u=0 : dec3.f = 0 : milieuy = bas +1 
Else : dec3.f = (xfin-xdeb)/u 
milieuy = ydeb : xx01= 1 
If milieuy > yfin : milieuy = yfin : xx01= 2 : EndIf 
EndIf 

Dim rvb(8)
rvb(0)= Red(couleur1) 
rvb(1)= Red(couleur2) 
rvb(2)= Red(couleur3) 
rvb(3)= Green(couleur1) 
rvb(4)= Green(couleur2) 
rvb(5)= Green(couleur3) 
rvb(6)= Blue(couleur1) 
rvb(7)= Blue(couleur2) 
rvb(8)= Blue(couleur3) 

If rec=1 : y1-1 : EndIf 
If rec=2 : y2-1 : EndIf 

dist12.f = Sqr((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
dist23.f = Sqr((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))
dist13.f = Sqr((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1))


;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo


For u = haut To bas 

If decb+deca>0


 
For n = xx-deca To xx+decb

dist1.f = Sqr((n-x1)*(n-x1)+(u-y1)*(u-y1))
dist2.f = Sqr((n-x2)*(n-x2)+(u-y2)*(u-y2))
dist3.f = Sqr((n-x3)*(n-x3)+(u-y3)*(u-y3))

If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3 
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3 
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf

If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 2
distM1.f = (dist12.f+dist13.f)/2
distM2.f = (dist12.f+dist23.f)/2
distM3.f = (dist13.f+dist23.f)/2
EndIf

If mode = 3
distM1.f = dist12.f
If distM1.f<dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f<dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f<dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 4
distM1.f = dist12.f*1.3
If distM1.f<dist13.f*1.3 : distM1.f = dist13.f*1.3 : EndIf
distM2.f = dist12.f*1.3
If distM2.f<dist23.f*1.3 : distM2.f = dist23.f*1.3 : EndIf
distM3.f = dist13.f*1.3 
If distM3.f<dist23.f*1.3 : distM3.f = dist23.f*1.3 : EndIf
EndIf


r1.f= lum - ((dist1/(distM1))*100)
r2.f= lum - ((dist2/(distM2))*100)
r3.f= lum - ((dist3/(distM3))*100)
v1.f= lum - ((dist1/(distM1))*100)
v2.f= lum - ((dist2/(distM2))*100)
v3.f= lum - ((dist3/(distM3))*100)
b1.f= lum - ((dist1/(distM1))*100)
b2.f= lum - ((dist2/(distM2))*100)
b3.f= lum - ((dist3/(distM3))*100)


rr4.f= (rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f= (rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f= (rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)

If alpha<100
c = Point(n,u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4+rr5
vv4+vv5
bb4+bb5
EndIf
EndIf


If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf

Plot (n,u,RGB(rr4,vv4,bb4))

Next
Else
For n = xx-deca To xx+decb Step -1
;;;

dist1.f = Sqr((n-x1)*(n-x1)+(u-y1)*(u-y1))
dist2.f = Sqr((n-x2)*(n-x2)+(u-y2)*(u-y2))
dist3.f = Sqr((n-x3)*(n-x3)+(u-y3)*(u-y3))

If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3 
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3 
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf

If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 2
distM1.f = (dist12.f+dist13.f)/2
distM2.f = (dist12.f+dist23.f)/2
distM3.f = (dist13.f+dist23.f)/2
EndIf

If mode = 3
distM1.f = dist12.f
If distM1.f<dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f<dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f<dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 4
distM1.f = dist12.f*1.3
If distM1.f<dist13.f*1.3 : distM1.f = dist13.f*1.3 : EndIf
distM2.f = dist12.f*1.3
If distM2.f<dist23.f*1.3 : distM2.f = dist23.f*1.3 : EndIf
distM3.f = dist13.f*1.3 
If distM3.f<dist23.f*1.3 : distM3.f = dist23.f*1.3 : EndIf
EndIf


r1.f= lum - ((dist1/(distM1))*100)
r2.f= lum - ((dist2/(distM2))*100)
r3.f= lum - ((dist3/(distM3))*100)
v1.f= lum - ((dist1/(distM1))*100)
v2.f= lum - ((dist2/(distM2))*100)
v3.f= lum - ((dist3/(distM3))*100)
b1.f= lum - ((dist1/(distM1))*100)
b2.f= lum - ((dist2/(distM2))*100)
b3.f= lum - ((dist3/(distM3))*100)


rr4.f= (rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f= (rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f= (rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)

If alpha<100
c = Point(n,u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4+rr5
vv4+vv5
bb4+bb5
EndIf
EndIf


If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf

Plot (n,u,RGB(rr4,vv4,bb4))

Next

;;;


EndIf


;pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp

If u < milieuy 
deca + dec1 
decb + dec2 
EndIf 

If u > milieuy 
  If xx01 = 1 
  deca - dec3 
  decb + dec2 
  Else 
  deca + dec1 
  decb + dec3 
  EndIf 
EndIf 

Next 

;  LineXY(x1,y1,x2,y2,1500000)
;  LineXY(x1,y1,x3,y3,1500000)
;  LineXY(x2,y2,x3,y3,1500000)


EndProcedure 

;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 
;- Debut du programme 
OpenWindow(1, 0, 150, 640, 500, #PB_Window_MinimizeGadget, "") 



If StartDrawing(WindowOutput()) 
; un fond pour tester l'alpha (mettre un alpha different de 100) :
;For i = 1 To 15 :  Box(Random (639),Random (499),Random (639),Random (499), RGB(Random (255),Random (255),Random (255))) : Next
StopDrawing() 
EndIf 

For plusieur = 1 To 30

; Toutes les lignes du dessous jusqu'a la ligne de commentaire avec plein de Z peuvent 
; etre effacé pour que l'utilisation mette ses propres valeurs ! 
 x1 = Random(597) +1 
 y1 = Random(497) +1 
 x2 = Random(597) +1 
 y2 = Random(497) +1 
 x3 = Random(597) +1 
 y3 = Random(497) +1 


lumiere = 100
alpha = 100  ;(mettez 1 ou 2, c'est rigolo...)
mode = 1

c1= RGB(Random(255),Random(255),Random(255))
c2= RGB(Random(255),Random(255),Random(255))
c3= RGB(Random(255),Random(255),Random(255))

; ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 

    If StartDrawing(WindowOutput()) 

      SPH_Triangle(x1, y1, x2, y2, x3, y3, c1, c2, c3, alpha, mode, lumiere)



;---------------  A  ---     ---  L  ---  I  ---  R  ---  E  ------------------

; alpha, c'est l'alpha (de 0 (transparent total) a 100(pas transparent))
; mode va de 0 a 4
; lumiere va de 50 a 150 (lumiere neutre = 100)
; pour que tu puisse voir chaque triangle :
;Delay (1500)
;------------------------------------------------------------------------------



       StopDrawing() 
    EndIf 
Next 

Repeat :  event = WindowEvent() : Until event=#PB_Event_CloseWindow
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est excellent, bravo 8O
Image
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Avec cette fois ci une possibilité de trouer et "BLURER" les triangles :

Code : Tout sélectionner

; Auteur : SPH (francais (51100 reims)) 
; Routine de tracé de triangles pleins avec ou sans dégradé et bordure 


Procedure SPH_Triangle(x1, y1, x2, y2, x3, y3, couleur1, couleur2, couleur3, alpha.f, mode, lum, trou, deplacement)
rec = 0 
If y1 = y2 : y1 + 1 : rec = 1: EndIf 
If y1 = y3 : y1 + 1 : rec = 1: EndIf 
If y2 = y3 : y2 + 1 : rec = 2: EndIf 

haut = y1 
xx.f = x1 
xy.f = y1 
xdeb.f = x2 
ydeb.f = y2 
xfin.f = x3 
yfin.f = y3 
plat = 0 

If x1=x2 And y1=y2 
plat = 1 
EndIf 
If x1=x3 And y1=y3 
plat = 1 
EndIf 
If x2=x3 And y2=y3 
plat = 1 
EndIf 
If x1=x2 And x2=x3 
plat = 1 
EndIf 
If y1=y2 And y2=y3 
plat = 1 
EndIf 
If plat = 1 : ProcedureReturn 0 : EndIf 

If y2<haut : ydeb = xy : xdeb= xx : haut = y2 : xx= x2 :xy=y2 : EndIf 
If y3<haut : yfin = xy : xfin= xx: haut = y3 : xx= x3 : xy=y3 : EndIf 


If xdeb>xfin 
u=xdeb : xdeb=xfin : xfin=u 
u=ydeb : ydeb=yfin : yfin=u 
EndIf 

bas = y1 
If y2>bas : bas = y2 : EndIf 
If y3>bas : bas = y3 : EndIf 

deca.f=0 
decb.f=0 
decc.f=0 

u = ydeb-haut : If u=0 : u=1 : EndIf 
dec1.f = (xx-xdeb)/u 
u = yfin-haut : If u=0 : u=1 : EndIf 
dec2.f = (xfin-xx)/u 
u = yfin-ydeb : If u=0 : dec3.f = 0 : milieuy = bas +1 
Else : dec3.f = (xfin-xdeb)/u 
milieuy = ydeb : xx01= 1 
If milieuy > yfin : milieuy = yfin : xx01= 2 : EndIf 
EndIf 

Dim rvb(8)
rvb(0)= Red(couleur1) 
rvb(1)= Red(couleur2) 
rvb(2)= Red(couleur3) 
rvb(3)= Green(couleur1) 
rvb(4)= Green(couleur2) 
rvb(5)= Green(couleur3) 
rvb(6)= Blue(couleur1) 
rvb(7)= Blue(couleur2) 
rvb(8)= Blue(couleur3) 

If rec=1 : y1-1 : EndIf 
If rec=2 : y2-1 : EndIf 

dist12.f = Sqr((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
dist23.f = Sqr((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))
dist13.f = Sqr((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1))


;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo


For u = haut To bas 

If decb+deca>0


 
For n = xx-deca To xx+decb

dist1.f = Sqr((n-x1)*(n-x1)+(u-y1)*(u-y1))
dist2.f = Sqr((n-x2)*(n-x2)+(u-y2)*(u-y2))
dist3.f = Sqr((n-x3)*(n-x3)+(u-y3)*(u-y3))

If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3 
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3 
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf

If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 2
distM1.f = (dist12.f+dist13.f)/2
distM2.f = (dist12.f+dist23.f)/2
distM3.f = (dist13.f+dist23.f)/2
EndIf

If mode = 3
distM1.f = dist12.f
If distM1.f<dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f<dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f<dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 4
distM1.f = dist12.f*1.3
If distM1.f<dist13.f*1.3 : distM1.f = dist13.f*1.3 : EndIf
distM2.f = dist12.f*1.3
If distM2.f<dist23.f*1.3 : distM2.f = dist23.f*1.3 : EndIf
distM3.f = dist13.f*1.3 
If distM3.f<dist23.f*1.3 : distM3.f = dist23.f*1.3 : EndIf
EndIf


r1.f= lum - ((dist1/(distM1))*100)
r2.f= lum - ((dist2/(distM2))*100)
r3.f= lum - ((dist3/(distM3))*100)
v1.f= lum - ((dist1/(distM1))*100)
v2.f= lum - ((dist2/(distM2))*100)
v3.f= lum - ((dist3/(distM3))*100)
b1.f= lum - ((dist1/(distM1))*100)
b2.f= lum - ((dist2/(distM2))*100)
b3.f= lum - ((dist3/(distM3))*100)


rr4.f= (rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f= (rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f= (rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)

If alpha<100
c = Point(n,u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4+rr5
vv4+vv5
bb4+bb5
EndIf
EndIf


If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf


If trou=0 And deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
If Random(trou) = 0
If deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
Plot (n+Random(deplacement*2)-deplacement,u+Random(deplacement*2)-deplacement,RGB(rr4,vv4,bb4))
EndIf
EndIf
EndIf


Next
Else
For n = xx-deca To xx+decb Step -1
;;;

dist1.f = Sqr((n-x1)*(n-x1)+(u-y1)*(u-y1))
dist2.f = Sqr((n-x2)*(n-x2)+(u-y2)*(u-y2))
dist3.f = Sqr((n-x3)*(n-x3)+(u-y3)*(u-y3))

If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3 
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3 
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf

If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 2
distM1.f = (dist12.f+dist13.f)/2
distM2.f = (dist12.f+dist23.f)/2
distM3.f = (dist13.f+dist23.f)/2
EndIf

If mode = 3
distM1.f = dist12.f
If distM1.f<dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f 
If distM2.f<dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f 
If distM3.f<dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 4
distM1.f = dist12.f*1.3
If distM1.f<dist13.f*1.3 : distM1.f = dist13.f*1.3 : EndIf
distM2.f = dist12.f*1.3
If distM2.f<dist23.f*1.3 : distM2.f = dist23.f*1.3 : EndIf
distM3.f = dist13.f*1.3 
If distM3.f<dist23.f*1.3 : distM3.f = dist23.f*1.3 : EndIf
EndIf


r1.f= lum - ((dist1/(distM1))*100)
r2.f= lum - ((dist2/(distM2))*100)
r3.f= lum - ((dist3/(distM3))*100)
v1.f= lum - ((dist1/(distM1))*100)
v2.f= lum - ((dist2/(distM2))*100)
v3.f= lum - ((dist3/(distM3))*100)
b1.f= lum - ((dist1/(distM1))*100)
b2.f= lum - ((dist2/(distM2))*100)
b3.f= lum - ((dist3/(distM3))*100)


rr4.f= (rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f= (rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f= (rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)

If alpha<100
c = Point(n,u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4+rr5
vv4+vv5
bb4+bb5
EndIf
EndIf


If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf

If trou=0 And deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
If Random(trou) = 0
If deplacement=0
Plot (n,u,RGB(rr4,vv4,bb4))
Else
Plot (n+Random(deplacement*2)-deplacement,u+Random(deplacement*2)-deplacement,RGB(rr4,vv4,bb4))
EndIf
EndIf
EndIf

Next

;;;


EndIf


;pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp

If u < milieuy 
deca + dec1 
decb + dec2 
EndIf 

If u > milieuy 
  If xx01 = 1 
  deca - dec3 
  decb + dec2 
  Else 
  deca + dec1 
  decb + dec3 
  EndIf 
EndIf 

Next 

;  LineXY(x1,y1,x2,y2,1500000)
;  LineXY(x1,y1,x3,y3,1500000)
;  LineXY(x2,y2,x3,y3,1500000)


EndProcedure 

;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 
;- Debut du programme 
OpenWindow(1, 0, 0, 1024, 768, #PB_Window_MinimizeGadget, "") 



If StartDrawing(WindowOutput()) 
; un fond pour tester l'alpha (mettre un alpha different de 100) :
;For i = 1 To 15 :  Box(Random (639),Random (499),Random (639),Random (499), RGB(Random (255),Random (255),Random (255))) : Next
StopDrawing() 
EndIf 

For plusieur = 1 To 10

; Toutes les lignes du dessous jusqu'a la ligne de commentaire avec plein de Z peuvent 
; etre effacé pour que l'utilisation mette ses propres valeurs ! 


lumiere = 100
alpha = 100  ;(mettez 1 ou 2, c'est rigolo...)
mode = 1
trou=1 ; (de 0 a 10 (+ en fait mais aucun interet))
deplacement=0 ; un espece de BLUR  (ATTENTION, certains points risquent de sortir (= bug))) ps: ici, la marge est de 29 ou 30
; is deplacement <> 0 alors ca rame un peu

 x1 = Random(992) +30 
 y1 = Random(733) +30
 x2 = Random(992) +30
 y2 = Random(733) +30
 x3 = Random(992) +30
 y3 = Random(733) +30


c1= RGB(Random(255),Random(255),Random(255))
c2= RGB(Random(255),Random(255),Random(255))
c3= RGB(Random(255),Random(255),Random(255))

; ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 

    If StartDrawing(WindowOutput()) 

      SPH_Triangle(x1, y1, x2, y2, x3, y3, c1, c2, c3, alpha, mode, lumiere, trou, deplacement)



;---------------  A  ---     ---  L  ---  I  ---  R  ---  E  ------------------

; alpha, c'est l'alpha (de 0 (transparent total) a 100(pas transparent))
; mode va de 0 a 4 (0=dark et 4=pastel)
; lumiere va de 50 a 150 (lumiere neutre = 100)
; pour que tu puisse voir chaque triangle :
;Delay (1500)
;------------------------------------------------------------------------------



       StopDrawing() 
    EndIf 
Next 

Repeat :  event = WindowEvent() : Until event=#PB_Event_CloseWindow
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message par Golfy »

Ok, c'était ludique et intéressant de lire comment vous avez tous créés une procédure de remplissage d'un polygone... mais pourquoi la fonction "polyline" n'existe pas en standard dans PureBasic :cry: ?

De mon temps, en GFA Basic c'était facile, pourtant... :roll:

Bon... je voulais faire des graphes - statistiques mais là, ça m'a un peu dégouté :wink:
Je vais peut-être regarder les API 8O :twisted:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Golfy a écrit :Je vais peut-être regarder les API


oui pis n'oublie pas de regarder du côté de GDI+ , ça sert à quoi que Denis se décarcasse pour nous sinon ? :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Y'en a une dans les api. Y'a pas ça sur codearchiv?
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message par Golfy »

comtois a écrit :
Golfy a écrit :Je vais peut-être regarder les API


oui pis n'oublie pas de regarder du côté de GDI+ , ça sert à quoi que Denis se décarcasse pour nous sinon ? :)
*mmmoui...* 12Mo de téléchargement : ça donne quoi une fois mon programme à moi (utilisant la GDI+) compilé ??? 8O
Parce que pour le moment, mon EXE (60 Ko) + le driver WinpCap (590 Ko) = 700 Ko environ :?

Par contre, ça répondrait exactement à mes besoins (le coté vectoriel + échelle automatique) :D

Je vais commencer par des lignes de base pour déboguer ma lecture de fichier stats et puis quand tout sera OK, j'y jetterai un oeil... 8)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Golfy a écrit :*mmmoui...* 12Mo de téléchargement : ça donne quoi une fois mon programme à moi (utilisant la GDI+) compilé ??? 8O
Parce que pour le moment, mon EXE (60 Ko) + le driver WinpCap (590 Ko) = 700 Ko environ :?
C'est 12 Mo de doc en français (plus de 600 fonctions expliquées) et presque 700 codes sources pour illustrer toutes ces fonctions.
Franchement c'est un sacré boulot. Je n'ai pas fini de tout tester, et de tout lire, mais c'est remarquable.

Tu as vu l'horlogede Erix14 ? il utilise GDI+ et son exe ne fait que ko.
Ou son éditeur 2D ? (c'est un début, il permet de tracer des lignes et des cercles)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message par Golfy »

8O 8O 8O 8O 8O

J'en reste baba :o
Bon, dès que mes stats fonctionnent, je m'y met : je télécharge les 12Mo de docs :)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Répondre