Les polygones

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Les polygones

Message par falsam »

@SPH : Tu comptes en faire quoi de tes polygones ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Les polygones

Message par falsam »

Une alternative à OpenGL avec les API Windows.

Le code qui va suivre peut fonctionner dans une fenêtre classique ou dans une fenêtre 2D ou dans un sprite transparent.

Principe :
- Déclarer les points de ton polygone dans une table,
- Récupérer le contexte graphique du dessin,
- Déclarer une brosse de couleur,
- Sélectionner le contexte graphique et la brosse,
- Dessiner le polygone.

Le code dans sa plus simple expression :wink:

Code : Tout sélectionner

EnableExplicit

; Contexte graphique et brosse
Global HDC, Brush

; Points x, y du polygone
Global Dim Points.l(8)
; Premier point
Points(0)=100 ;X
Points(1)=100 ;y

; Second point 
Points(2)=280 ;X
Points(3)=150 ;y

; Troisiéme point
Points(4)=400 ;X
Points(5)=400 ;y

; Quatriéme point
Points(6)=100 ;X
Points(7)=300 ;y

; Fenetre et ecran graphique 2D
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "Dessin d'un polygone",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
ClearScreen(RGB(255, 255, 255))

; Récupération du contexte graphique
HDC = StartDrawing(ScreenOutput())

; Création du brosse de couleur
Brush = CreateSolidBrush_(RGB(154, 205, 50))

; Sélection du contexte graphique et de la brosse que nous allons utiliser
SelectObject_(HDC, Brush)

; Dessin du polygone de quatre points
Polygon_(HDC, @Points(), 4)

StopDrawing()

; Loop : N'importe quelle touche pour quitter
Repeat : Until WaitWindowEvent() = #WM_CHAR
Qu'il est beau le polygone :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Les polygones

Message par SPH »

Interessant :!:

:lol:

Falsam : reste que je choisirais l'affichage des polygones le plus rapide... (je testerais demain) :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Les polygones

Message par Zorro »

ou bien ma version "Old School"

ici j'augmente le nombre de coté du polygone en meme temps qu'il tourne :)

le polygone est mis en Procedure , ainsi qu'une procedure pour le remplissage couleur :)

l'avantage de ma procedure, c'est que tu peux donner un angle a ton polygone :)

Code : Tout sélectionner


;code Dobro
; mis en Purebasic 4.20
#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,  "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
      
      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=3 ; 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
                  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=angle+1
                        If angle>10: angle=3:EndIf
                        c=0
                  EndIf 
                  FlipBuffers():; affiche l'ecran 
                  ClearScreen(RGB(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)  
      ;by Dobro
            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)
             ;by Dobro
            pinceau=CreateSolidBrush_(couleur_remplissage)
            SelectObject_(*hdc,pinceau)
            ExtFloodFill_(*hdc,x,y,GetPixel_(*hdc,x,y),#FLOODFILLSURFACE)
            DeleteObject_(pinceau)
            ReleaseDC_(WindowID(1),*hdc)
      EndProcedure
      
      
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Les polygones

Message par SPH »

Merci zorro,

je le mettrais aussi a l'epreuve de la vitesse :wink:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
manababel
Messages : 135
Inscription : jeu. 14/mai/2020 7:40

Re: Les polygones

Message par manababel »

voici une méthode que j'utilisais sous blitz3d
apparemment, ça a l'air de marcher aussi avec purebasic

version ou chaque polygone est une "entity"
version plus simple mais plus lente

Code : Tout sélectionner

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  
  OpenWindow(1, 0, 0, 200, 100, "",  #PB_Window_SystemMenu)
  
  
  If Screen3DRequester()
    
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    SetMaterialColor(0, #PB_Material_AmbientColor, -1)
    
    tt=0
    For y=-10000 To 10000 Step 250
      For x=-15000 To 15000 Step 250
        Couleur=Random($ffffff,$7f7f7f)
          CreateMesh(tt)
          MeshVertexPosition(-100, 100, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100, 100, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100, -100, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(-100, -100, z)
          MeshVertexColor(Couleur)
          MeshFace(2, 3, 0)
          MeshFace(0, 1, 2)
          FinishMesh(#True)
    
        CreateEntity(tt, MeshID(tt), MaterialID(0))
        EntityLookAt(tt,0,0,1)
        MoveEntity(tt,x,y,0)
        tt=tt+1
        ;If tt>=100000 : Break :EndIf
      Next  
    Next

  
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 30000, #PB_Absolute)
    
    
    Repeat
      t=ElapsedMilliseconds()
      Screen3DEvents()
      ;For i=0 To tt-1
        ;RotateEntity(i, 0, 0, 1, #PB_Relative)
      ;Next
      
      RenderWorld()
      Screen3DStats()      
      FlipBuffers()
      t=ElapsedMilliseconds()-t
      StartDrawing(WindowOutput(1))
      DrawText(5,5,Str(tt)+" entity")
      DrawText(5,25,Str(t)+"      ")
      StopDrawing()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End




version avec une seule 'intity'

Code : Tout sélectionner

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  OpenWindow(1, 0, 0, 200, 100, "",  #PB_Window_SystemMenu)
  
  If Screen3DRequester()
    
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    SetMaterialColor(0, #PB_Material_AmbientColor, -1)
    
    z=0
    tt=0
    CreateMesh(tt)
    For y=-12000 To 12000 Step 250
      For x=-16000 To 16000 Step 250
        Couleur=Random($ffffff,$7f7f7f)    
          MeshVertexPosition(-100+x, 100+y, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100+x, 100+y , z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100+x, -100+y, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(-100+x, -100+y, z)
          MeshVertexColor(Couleur)
          MeshFace(2+tt, 3+tt, 0+tt)
          MeshFace(0+tt, 1+tt, 2+tt)
          tt=tt+4
        Next
      Next

      FinishMesh(#True)
        CreateEntity(0, MeshID(0), MaterialID(0))
        EntityLookAt(0,0,0,1)
        ;MoveEntity(tt,x,y,0)
        tt=tt+1
        ;If tt>=100 : Break :EndIf
      ;Next  
    ;Next
  Debug Str(tt)+" entity"

    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 30000, #PB_Absolute)
    
    Repeat
      t=ElapsedMilliseconds()
      Screen3DEvents()
      ;For i=0 To tt-1
       ;RotateEntity(0, 0, 0, 1, #PB_Relative)
      ;Next
      
      RenderWorld()
      Screen3DStats()      
      FlipBuffers()
      t=ElapsedMilliseconds()-t
      StartDrawing(WindowOutput(1))
      DrawText(5,5,Str(tt/4)+" entity")
      DrawText(5,25,Str(t)+"      ")
      StopDrawing()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Les polygones

Message par falsam »

@SPH : Je me suis encore pencher sur tes polygones.

Tu voulais faire un test sur 100.000 polygones.

Avec ma méthode c'est bien trop long. La méthode la plus rapide me semble être effectivement OpenGL.

Avec ce code j'affiche 100.000 polygones.
- Couleur aléatoire.
- Transparence aléatoire.
- Position aléatoire.

Code : Tout sélectionner

Procedure.f RandomFloat(Maximum.f = 1.0, Minimum.f=0.0)
  ProcedureReturn (Maximum-Minimum) * 4.6566128752457969241e-10 * Random(2147483647) + Minimum  
EndProcedure

If OpenWindow(0,0,0,1280,800,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
  If OpenGLGadget(1,0,0,1280,800)
    
    ; Volume de visualisation 
    glMatrixMode_(#GL_PROJECTION)
    glOrtho_(0, 1280, 800, 0, -1, 1)
    
    ; Activation de la transparence 
    glEnable_(#GL_BLEND)
    glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
    
    timer=ElapsedMilliseconds()
    
    For n = 1 To 100000
      x = Random(1280)
      y = Random(800)
      
      glColor4f_(RandomFloat(), RandomFloat(), RandomFloat(), RandomFloat(1, 0.1))
      
      glBegin_(#GL_POLYGON)
      glVertex2f_(x, y)
      glVertex2f_(x+100, y+100)
      glVertex2f_(x + 50, y + 150)
      glEnd_()      
    Next    
    
    ; Flip 
    SetGadgetAttribute(1, #PB_OpenGL_FlipBuffers, #True)
    timer=ElapsedMilliseconds()-timer
    Debug timer
    
  EndIf
  Repeat : Until WaitWindowEvent() = #WM_CHAR
EndIf
Sur un Intel i3 j'affiche 160 ms.

:arrow: N'importe quelle touche pour quitter l'exécution.

:!: La remarque désagréable : Je pense que le jeu que tu souhaites créer (La suite de Another World) n'utilisera pas 100.000 polygones simultanément. Te lancer dans ce type de jeu avec une connaissance faible en OpenGL me parait compliquer et vouer à l'échec.

Pense à la gestion des sprites de PureBasic.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Les polygones

Message par SPH »

La remarque désagréable : Je pense que le jeu que tu souhaites créer (La suite de Another World) n'utilisera pas 100.000 polygones simultanément. Te lancer dans ce type de jeu avec une connaissance faible en OpenGL me parait compliquer et vouer à l'échec.
Je n'ai jamais dis que je ferais un jeu avec 100000 polygones. J'ai testé la rapidité de l'affichage de polygones en en appliquant 100000. C'est pas pareil.
Le test de rapidité utilise 100000 polygones et une fois que ce test a reussi pour l'opengl, j'utiliserais cette methode (l'opengl) pour en faire un jeu (enfin, dans un second temps car en premier, je vais faire une ou deux anims)
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Répondre