Polygons

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Polygons

Message par kelly »

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
MessageRequester("ERROR","Cant init DirectX",0) 
End 
EndIf 

MainWnd.l = OpenWindow(0, 0, 0, 600,500, #PB_Window_ScreenCentered, "Polygon Beispiel") 
If OpenWindowedScreen(MainWnd.l, 0, 0, 600,500, 1, 0, 0) 

If P2D_InitPolygonDrawing() 
; -- Triangle 
P2D_SetPolygonPoint(2, 0, 0, 50) 
P2D_SetPolygonPoint(2, 1, 220, 120) 
P2D_SetPolygonPoint(2, 2, 30, 150) 

P2D_CreatePolygon(2, RGB(255,0,255), RGB(255,0,0)) 
EndIf 

EndIf 

Repeat 
While WindowEvent() : Wend 
ExamineKeyboard() 
ExamineMouse() 
P2D_DisplayTransparentPolygon(2, 20, 140) 
FlipBuffers() 
ClearScreen(0, 4, 0) 
Until KeyboardPushed(#PB_KEY_ESCAPE) 
Ce type de polygon (ici un triangle) bug parfois !
Pourquoi ?? (remplacez donc le "50" de "P2D_SetPolygonPoint(2, 0, 0, 50)" par un "0" et la, ca marche)
Y a t'il une autre technique pour tracer des polygons ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

la procedure cidessous
polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t)

ou

x.l =coordonée x du polygone
y.l =coordonée y du polygone
angle.l= nombre de cotés du polygone 3=triangle ; 4=carre ;5 penta, ect..

rotation.f = angle de rotation en degré du polygone !!
color.l = couleur du tracé !!

t= c'est juste une variable pour pouvoir ecrire les degrs pendant la rotation !! :D


Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
#PI=3.1415926
Declare polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
  WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello")
  
  WindowID = WindowID(1)
  Result = OpenWindowedScreen(WindowID,0,0,800, 600, 1, 0,0)
  
  
  
  Resultat = InitMouse() 
  Repeat
    ExamineMouse()
    Event=WindowEvent() 
    If MouseButton(2)
      End
    EndIf
    
    
    
    ;Star(x.l,y.l,intrad.l,n.l,phase.f,color.l)
    
    x.l=400 ;location x
    y.l=300 ; location y
    taille.l=100
    angle.l=4 ; pour un triangle  4 pour un carre , 8 pour un octogone ect ...
    rotation.f=180
    
    color.l=RGB($FF,$FF,$80)
    For t=0 To 360
    ; Delay (200)
    rotation.f=t 
      polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t)
     FlipBuffers():; affiche l'ecran
      ClearScreen(0,0,0) 
      ExamineMouse()
      Event=WindowEvent() 
      If MouseButton(2)
        End
      EndIf
    Next t
    

    
    
  Until Event=#PB_Event_CloseWindow
  
  
  
  
  Procedure  polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t)
    If angle.l=4 

    Else
    
    EndIf
     rotation.f= rotation.f*0.01745329
    StartDrawing(ScreenOutput() )
    DrawText(StrF( t))
    alpha.f=2*(#PI/angle)
    For t.l=1 To angle
      d1.f=(t-1)*alpha+rotation.f
      d3.f=t*alpha+rotation.f
      LineXY(x+taille*Sin(d1),y+taille*Cos(d1),x+taille*Sin(d3),y+taille*Cos(d3),color)
    Next
    StopDrawing()
  EndProcedure 
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

teuteuteut !!!!!!!!
Dobro, je parle de polygones remplis (je cherche ca moi)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

avec les valeurs de ton triangle , ça marche , et le triangle est rempli , j'espère que je ne vais pas me faire engueuler :)

Code : Tout sélectionner

InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"Demo")

Dim points.Point(2)
points(0)\x=0
points(0)\y=50
points(1)\x=220
points(1)\y=120
points(2)\x=30
points(2)\y=150
Repeat
    FlipBuffers()

    ClearScreen(0,0,30)
    
    ExamineKeyboard()
hdc=StartDrawing(ScreenOutput())
If hdc

	FrontColor(255,255,55)
	Polygon_(hdc,points(),3)
EndIf
StopDrawing()	
    
Until KeyboardPushed(#PB_Key_Escape)
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.
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

Voila un polygon digne de ce nom. Merci Comtois. Libre a toi maintenant d'epouser la fillotte du duc de pouille. Tu en etait fou... JE TE LA DONNE EN EPOUSAILLE !!!

Code : Tout sélectionner

InitSprite() 
InitKeyboard() 
OpenScreen(1024,768,32,"Demo") 

Dim points.Point(5) 
points(0)\x=50 
points(0)\y=0 
points(1)\x=220 
points(1)\y=120 
points(2)\x=30 
points(2)\y=150 
points(3)\x=111
points(3)\y=650 
points(4)\x=888
points(4)\y=11 
points(5)\x=65 
points(5)\y=325 
Repeat 
    FlipBuffers() 

    ClearScreen(0,0,30) 
    
    ExamineKeyboard() 
hdc=StartDrawing(ScreenOutput()) 
If hdc 

   FrontColor(255,255,55) 
   Polygon_(hdc,points(),6) 
EndIf 
StopDrawing()    
    
Until KeyboardPushed(#PB_Key_Escape)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

le duc de pouille avait aussi un fillot , il a fini sa carrière au vatican en devenant pape.
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

teuteuteut !!!!!!!!
Dobro, je parle de polygones remplis (je cherche ca moi)
ya bien qu'a toi que ça pose un problem a remplir !

et avant que tu critique !

avec cette version ya un avantage !! tu choisi le nombre de cote du polygone !
ça marche pas QUE pour les triangles et pis c'est sans LIB !
et en plus il tourne !

Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
#PI=3.1415926
Declare polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t,coul_remp.l)
Declare rempli(x,y,Couleur)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
  WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello")
  
  WindowID = WindowID(1)
  Result = OpenWindowedScreen(WindowID,0,0,800, 600, 1, 0,0)
  
  
  
  Resultat = InitMouse() 
  Repeat
    ExamineMouse()
    Event=WindowEvent() 
    If MouseButton(2)
      End
    EndIf
    
    
    
    ;Star(x.l,y.l,intrad.l,n.l,phase.f,color.l)
    
    x.l=400 ;location x
    y.l=300 ; location y
    taille.l=100
    angle.l=Random(10)+2 ; pour un triangle  4 pour un carre , 8 pour un octogone ect ...
    rotation.f=180
    
   
    For tp=0 To 360
    ; Delay (200)
      t=1
      rotation.f=tp
      color.l=RGB($FF,$FF,$FF) ; couleur du tour$
      
      
      
      coul_remp.l=RGB($A8,$B0,$2) ; couleur du remplissage !
      
      c=c+1
      polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t,coul_remp.l)
      If c=50
        angle.l=Random(8)+3
        c=0
    EndIf
    
     FlipBuffers():; affiche l'ecran
      ClearScreen(0,0,0) 
      ExamineMouse()
      Event=WindowEvent() 
      If MouseButton(2)
        End
      EndIf
    Next tp
    

    
    
  Until Event=#PB_Event_CloseWindow
  
  
  
  
  Procedure  polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t,coul_remp.l) 
    
     rotation.f= rotation.f*0.01745329
   
    alpha.f=2*(#PI/angle)
    
   
    For t.l=1 To angle
      d1.f=(t-1)*alpha+rotation.f
      d3.f=t*alpha+rotation.f
      
     StartDrawing(ScreenOutput() )

    For i=1 To taille-1  
        LineXY(x-i*Sin(d1),y-i*Cos(d1),x-i*Sin(d3),y-i*Cos(d3),coul_remp.l)
      Next i
        StopDrawing()
      
    Next t
 
  EndProcedure 
  
 


  
  
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Je dois être le plus mauvais du forum en graphisme mais tu peux pas utiliser la fonction FillArea ?
C'est que le triangle remplis il est un poil moche quand il tourne (on voit les traces noires entre les lignes).
Vive le thread-safe !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ben c'est pas de ma faute si le pure ne gere pas beaucoup de chiffre en flottant :D


plus serieusement , le probleme c'est que la fonction lignexy cree des petits trous , et le fill area passe au travers !!

j'ai bien essayé , mais j'ai pas voulu passer ma soiré la dessus ! :D

essaye si tu veux ! :D
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

Ton remplissage n'est pas celui que ferait un paint. Et puis ca rame avec de grands polygons (voir le code).
Par contre, dite moi d'ou viennent ces polygons. Ce n'est pas dans le PB d'origine. Alors, qui a fait cette lib, et combien en existe t'il ?

Code : Tout sélectionner

#dobro=1 
#Police=1 
#Sprite=1 
#PI=3.1415926 
Declare polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t,coul_remp.l) 
Declare rempli(x,y,Couleur) 
; *********************************** 
Resultat = InitSprite() 
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold ) 
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran 
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran 
  WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello") 
  
  WindowID = WindowID(1) 
  Result = OpenWindowedScreen(WindowID,0,0,800, 600, 1, 0,0) 
  
  
  
  Resultat = InitMouse() 
  Repeat 
    ExamineMouse() 
    Event=WindowEvent() 
    If MouseButton(2) 
      End 
    EndIf 
    
    
    
    ;Star(x.l,y.l,intrad.l,n.l,phase.f,color.l) 
    
    x.l=400 ;location x 
    y.l=300 ; location y 
    taille.l=400
    angle.l=Random(10)+2 ; pour un triangle  4 pour un carre , 8 pour un octogone ect ... 
    rotation.f=180 
    
    
    For tp=0 To 360 
    ; Delay (200) 
      t=1
      rotation.f=tp 
      color.l=RGB($FF,$FF,$FF) ; couleur du tour$ 
      
      
      
      coul_remp.l=RGB($A8,$B0,$2) ; couleur du remplissage ! 
      
      c=c+1 
      polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t,coul_remp.l) 
      If c=50 
        angle.l=Random(100)+3 
        c=0 
    EndIf 
    
     FlipBuffers():; affiche l'ecran 
      ClearScreen(0,0,0) 
      ExamineMouse() 
      Event=WindowEvent() 
      If MouseButton(2) 
        End 
      EndIf 
    Next tp 
    

    
    
  Until Event=#PB_Event_CloseWindow 
  
  
  
  
  Procedure  polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,t,coul_remp.l) 
    
     rotation.f= rotation.f*0.01745329 
    
    alpha.f=2*(#PI/angle) 
    
    
    For t.l=1 To angle 
      d1.f=(t-1)*alpha+rotation.f 
      d3.f=t*alpha+rotation.f 
      
     StartDrawing(ScreenOutput() ) 

    For i=1 To taille-1  
        LineXY(x-i*Sin(d1),y-i*Cos(d1),x-i*Sin(d3),y-i*Cos(d3),coul_remp.l) 
      Next i 
        StopDrawing() 
      
    Next t 
  
  EndProcedure 
   
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Pour ceux qui douteraient encore de la vitesse de dessin
http://purebasic.hmt-forum.com/viewtopic.php?t=3701

Dri ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tiens fillette !! :D

Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
#PI=3.1415926
Declare polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r.b,coul_remp.l)
Declare  remplis(*hdc,x,y,couleur_remplissage)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
  WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello")
  
  WindowID = WindowID(1)
  ecran= OpenWindowedScreen(WindowID,0,0,800, 600, 1, 0,0)
  
  
  
  Resultat = InitMouse() 
  Repeat
    ExamineMouse()
    Event=WindowEvent() 
    If MouseButton(2)
      End
    EndIf
    
    
    x.l=400 ;location x
    y.l=300 ; location y
    taille.l=300
    angle.l=4 ; pour un triangle  4 pour un carre , 8 pour un octogone ect ...
    rotation.f=180
    
    
    For tp=0 To 360
      ; Delay (200)
      
      r=1 ; remplis ou pas !!
      rotation.f=tp ; parametre de rotation en degre
      color.l=RGB($FF,$FF,$FF) ; couleur du tour$ 
      coul_remp.l=RGB($F9,$FE,$8B) ; couleur du remplissage !
      
      c=c+1
      polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r,coul_remp.l)
      If c=50
        angle.l=Random(8)+3
        c=0
      EndIf
      
      FlipBuffers():; affiche l'ecran
      
       ClearScreen(0,0,0) 
      ExamineMouse()
      Event=WindowEvent() 
      If MouseButton(2)
        End
      EndIf
    Next tp
    
    
    
    
  Until Event=#PB_Event_CloseWindow
  
  
  
  
  Procedure  polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r.b,coul_remp.l)  
    rotation.f= rotation.f*0.01745329 
    alpha.f=2*(#PI/angle) 
    For t.l=1 To angle
      d1.f=(t-1)*alpha+rotation.f
      d3.f=t*alpha+rotation.f 
      *dc=StartDrawing(ScreenOutput() )
      DrawingMode(4) 
      LineXY(x+taille*Sin(d1),y+taille*Cos(d1),x+taille*Sin(d3),y+taille*Cos(d3),color.l); polygone vide  
      StopDrawing() 
    Next t 
    If r=1
    *dc=StartDrawing(ScreenOutput() )
    DrawingMode(4)  
    remplis(*dc,x,y,coul_remp.l ) 
    StopDrawing() 
  EndIf
  
    
  EndProcedure 
  
  
  Procedure remplis(*hdc,x,y,couleur_remplissage)
   pinceau=CreateSolidBrush_(couleur_remplissage)
    SelectObject_(*hdc,pinceau)
    ExtFloodFill_(*hdc,x,y,GetPixel_(*hdc,x,y),#FLOODFILLSURFACE)
    DeleteObject_(pinceau)
    ReleaseDC_(WindowID(),*hdc)
  EndProcedure
  
  
  
  
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

Dr. Dri a écrit :Pour ceux qui douteraient encore de la vitesse de dessin
http://purebasic.hmt-forum.com/viewtopic.php?t=3701

Dri ;)
Ca marche pas.
Par contre, d'où viennent des fonction de polygons ????
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

explique moi ce qui ne marche pas stp
(plus de détails)

sinon cette fonction fait partie de l'api win32

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@Kelly : si le code que j'ai mis t'indifere , dit le moi
je saurai m'en souvenir !
Répondre