Seite 1 von 1

feld schneller interpolieren und visualisieren

Verfasst: 01.07.2007 16:48
von r7mk4
Hi,

hab vor Ewigkeiten schonmal angefragt und erstmal herausgekriegt, daß das was ich machen wollte "Interpolieren" heißt.
Vielen Dank dafür mal...

Leider war das Projekt eingeschlafen und jetzt habe ich mal wieder ein wenig Zeit gefunden zu coden und stoße gleich wieder an meine Grenzen :roll:

Zum Hintergrund: Ich will ein Feld 16x16 interpoliert darstellen. (16x16-Klötzchen sehen scheiße aus :mrgreen: )

Schaut euch mal den Code an und sagt mir bitte, wie ich den schneller bekomme:

Code: Alles auswählen


Enumeration
#Window
#Button1
#Button2
#Button3
#Text1
#Sprite
#SpriteF0
#SpriteF1
#SpriteF2
#SpriteF3
#SpriteF4
#SpriteF5
#SpriteF6
#SpriteF7
#SpriteF8
#SpriteF9
#SpriteF10
#SpriteF11
#TIMER
EndEnumeration

Global Grenze0.w   
Global Grenze1.w   
Global Grenze2.w   
Global Grenze3.w   
Global Grenze4.w   
Global Grenze5.w   
Global Grenze6.w   
Global Grenze7.w   
Global Grenze8.w   
Global Grenze9.w   
Global Grenze10.w  
Global Grenze11.w  


Grenze0     = 50
Grenze1     = 70
Grenze2     = 110
Grenze3     = 130
Grenze4     = 160
Grenze5     = 180
Grenze6     = 190
Grenze7     = 200
Grenze8     = 210
Grenze9     = 220
Grenze10    = 230
Grenze11    = 240

Global Dim Farbe.l(11)

Farbe(0)     = $0000FF
Farbe(1)     = $0060E0
Farbe(2)     = $0080E0
Farbe(3)     = $00A0E0
Farbe(4)     = $00C0E0
Farbe(5)     = $00E0E0
Farbe(6)     = $00E0A0
Farbe(7)     = $00E040
Farbe(8)     = $80E000
Farbe(9)     = $C0C000
Farbe(10)    = $C08000
Farbe(11)    = $E8E8E8
                ;BGR
Global Grafikmodus.l = 0

Global Dim feldnormiert.w(16,16)


Global Dim feld_interpolierty1.w(16,32)
Global Dim feld_interpoliert1.w(32,32)

Global Dim feld2_interpolierty2.w(31,62)
Global Dim feld2_interpoliert2.w(62,62)

Global Dim feld3_interpolierty3.w(122,122)
Global Dim feld3_interpoliert3.w(122,122)


Global FP10S_Counter.w = 0

;********************Init Direct3D***************************** 
Global XPos
Global addX
Global YPos
Global addY

Structure MyVertices 
  x1.f 
  y1.f 
  z1.f 
  rhw1.f 
  color1.l 
  diffuse1.l 
  
  x2.f 
  y2.f 
  z2.f 
  rhw2.f 
  color2.l 
  diffuse2.l 
  
  x3.f 
  y3.f 
  z3.f 
  rhw3.f 
  color3.l 
  diffuse3.l 
  
  x4.f 
  y4.f 
  z4.f 
  rhw4.f 
  color4.l 
  diffuse4.l      
EndStructure 

#D3DCLEAR_TARGET=1 

#D3DFVF_XYZRHW=4 
#D3DFVF_DIFFUSE=64 
#D3DFVF_SPECULAR=128 

#D3DPT_POINTLIST=1 
#D3DPT_LINELIST=2      
#D3DPT_TRIANGLELIST=4 
#D3DPT_TRIANGLESTRIP=5 

#D3DRENDERSTATE_CULLMODE=22 
#D3DRENDERSTATE_DITHERENABLE=26 
#D3DRENDERSTATE_SPECULARENABLE=29 
#D3DRENDERSTATE_COLORKEYENABLE=41 
#D3DRENDERSTATE_LIGHTING=137 
#D3DCULL_NONE=1 
#D3DCULL_CCW=3 
    


Procedure Sprite3D_Start2DDrawing() 
  Global Sprite3D_Points.MyVertices 
  Global *D3DDevice.IDirect3DDevice7 
  Global TempSprite 
  
  !extrn _PB_Direct3D_Device 
  !MOV Eax,[_PB_Direct3D_Device] 
  !MOV [p_D3DDevice],Eax 
  
  Sprite3D_Points\rhw1=1.0 
  Sprite3D_Points\rhw2=1.0 
  Sprite3D_Points\rhw3=1.0 
  Sprite3D_Points\rhw4=1.0 
  
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_COLORKEYENABLE,0) ; disables colorkey 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_SPECULARENABLE,1) 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_DITHERENABLE,1) ; enables dithering (improves the quality) 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_LIGHTING,0); deactivates lighting 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_CULLMODE,#D3DCULL_NONE); disables culling 
  
  CapsBuffer=AllocateMemory(228) 
  *D3DDevice\GetCaps(CapsBuffer) 
  
  minTextureWidth=PeekL(CapsBuffer+124) 
  minTextureHeight=PeekL(CapsBuffer+128) 
  FreeMemory(CapsBuffer) 
  
  TempSprite=CreateSprite(#PB_Any,minTextureWidth,minTextureHeight,#PB_Sprite_Texture) 
  If IsSprite(TempSprite) 
    *D3DDevice\SetTexture(0,PeekL(IsSprite(TempSprite))) 
  EndIf 
EndProcedure 



Procedure Sprite3D_Stop2DDrawing() 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_COLORKEYENABLE,1);enable colorkey 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_SPECULARENABLE,0) 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_DITHERENABLE,0) 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_LIGHTING,1); activate lighting 
  *D3DDevice\SetRenderState(#D3DRENDERSTATE_CULLMODE,#D3DCULL_CCW) 
  FreeSprite(TempSprite) 
EndProcedure 



Procedure Sprite3D_DrawLine2D(x1.f,y1.f,x2.f,y2.f,RGB1,RGB2) 
  Sprite3D_Points\x1=x1 
  Sprite3D_Points\y1=y1 
  Sprite3D_Points\diffuse1=RGB1>>16+(RGB1&$FF00)+(RGB1&$FF)<<16 ;convert RGB to BGR 
  Sprite3D_Points\x2=x2 
  Sprite3D_Points\y2=y2 
  Sprite3D_Points\diffuse2=RGB2>>16+(RGB2&$FF00)+(RGB2&$FF)<<16 
  ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_LINELIST,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,2,0) 
EndProcedure 



Procedure Sprite3D_ClearScreen(RGB) 
  *D3DDevice\Clear(0,0,#D3DCLEAR_TARGET,RGB>>16+(RGB&$FF00)+(RGB&$FF)<<16,0,0) 
EndProcedure 



Procedure Sprite3D_DrawTriangle2D(x1.f,y1.f,x2.f,y2.f,x3.f,y3.f,RGB1,RGB2,RGB3) 
  Sprite3D_Points\x1=x1 
  Sprite3D_Points\y1=y1 
  Sprite3D_Points\diffuse1=RGB1>>16+(RGB1&$FF00)+(RGB1&$FF)<<16 
  Sprite3D_Points\x2=x2 
  Sprite3D_Points\y2=y2 
  Sprite3D_Points\diffuse2=RGB2>>16+(RGB2&$FF00)+(RGB2&$FF)<<16 
  Sprite3D_Points\x3=x3 
  Sprite3D_Points\y3=y3 
  Sprite3D_Points\diffuse3=RGB3>>16+(RGB3&$FF00)+(RGB3&$FF)<<16 
  ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_TRIANGLELIST,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,3,0) 
EndProcedure 



Procedure Sprite3D_DrawBox2D(X.f,Y.f,Width.f,Height.f,RGB1,RGB2,RGB3,RGB4) 
  Sprite3D_Points\x1=X ;Pos_links_oben
  Sprite3D_Points\y1=Y 
  Sprite3D_Points\diffuse1=RGB1>>16+(RGB1&$FF00)+(RGB1&$FF)<<16 
  Sprite3D_Points\x2=X+Width ;Pos_rechts_oben
  Sprite3D_Points\y2=Y 
  Sprite3D_Points\diffuse2=RGB2>>16+(RGB2&$FF00)+(RGB2&$FF)<<16 
  Sprite3D_Points\x3=X       ;Pos_links_unten
  Sprite3D_Points\y3=Y+Height 
  Sprite3D_Points\diffuse3=RGB3>>16+(RGB3&$FF00)+(RGB3&$FF)<<16 
  Sprite3D_Points\x4=X+Width  ;Pos_rechts_unten
  Sprite3D_Points\y4=Y+Height 
  Sprite3D_Points\diffuse4=RGB4>>16+(RGB4&$FF00)+(RGB4&$FF)<<16 
  ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_TRIANGLESTRIP,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,4,0) 
EndProcedure 

;#D3DPT_TRIANGLESTRIP,

Procedure Sprite3D_DrawPixel2D(X.f,Y.f,RGB) 
  Sprite3D_Points\x1=X 
  Sprite3D_Points\y1=Y 
  Sprite3D_Points\diffuse1=RGB>>16+(RGB&$FF00)+(RGB&$FF)<<16 
  ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_POINTLIST,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,1,0) 
EndProcedure 


Procedure feld_zeichnen121x121()

FP10S_Counter + 1

If Grafikmodus = 1
     StartDrawing(SpriteOutput(#Sprite)) 
        
                       For ky = 0 To 120 
                        For kx = 0 To 120
                               
                           If feld3_interpoliert3(ky,kx)   = < Grenze1    
                            Box(4*kx,4*ky,4,4,Farbe(11))
                             ElseIf feld3_interpoliert3(ky,kx)   =< Grenze2 And feld3_interpoliert3(ky,kx) >Grenze1
                               Box(4*kx,4*ky,4,4,Farbe(10))
                               ElseIf feld3_interpoliert3(ky,kx)   =< Grenze3 And feld3_interpoliert3(ky,kx) >Grenze2
                                Box(4*kx,4*ky,4,4,Farbe(9))
                                 ElseIf feld3_interpoliert3(ky,kx)   =< Grenze4 And feld3_interpoliert3(ky,kx) >Grenze3
                                  Box(4*kx,4*ky,4,4,Farbe(8))
                                   ElseIf feld3_interpoliert3(ky,kx)   =< Grenze5 And feld3_interpoliert3(ky,kx) >Grenze4
                                    Box(4*kx,4*ky,4,4,Farbe(7))
                                     ElseIf feld3_interpoliert3(ky,kx)   =< Grenze6 And feld3_interpoliert3(ky,kx) >Grenze5
                                      Box(4*kx,4*ky,4,4,Farbe(6))
                                       ElseIf feld3_interpoliert3(ky,kx)   =< Grenze7 And feld3_interpoliert3(ky,kx) >Grenze6
                                        Box(4*kx,4*ky,4,4,Farbe(5))
                                         ElseIf feld3_interpoliert3(ky,kx)   =< Grenze4 And feld3_interpoliert3(ky,kx) >Grenze7
                                          Box(4*kx,4*ky,4,4,Farbe(4))
                                           ElseIf feld3_interpoliert3(ky,kx)   =< Grenze9 And feld3_interpoliert3(ky,kx) >Grenze4
                                            Box(4*kx,4*ky,4,4,Farbe(3))
                                             ElseIf feld3_interpoliert3(ky,kx)   =< Grenze10 And feld3_interpoliert3(ky,kx) >Grenze9
                                              Box(4*kx,4*ky,4,4,Farbe(2)) 
                                               ElseIf feld3_interpoliert3(ky,kx)   =< Grenze11 And feld3_interpoliert3(ky,kx) >Grenze10
                                                Box(4*kx,4*ky,4,4,Farbe(1))
                                                 ElseIf feld3_interpoliert3(ky,kx) > Grenze11
                                                  Box(4*kx,4*ky,4,4,Farbe(0))
                          
                           EndIf
                        Next
                      Next   
                        
StopDrawing()                   
FlipBuffers()
DisplaySprite(#Sprite,0,0)



;andere Methode
  ElseIf Grafikmodus = 0
  Start3D()
  Sprite3D_Start2DDrawing()
 
                       For ky = 0 To 120 
                        For kx = 0 To 120
                               
                           If feld3_interpoliert3(ky,kx)   = < Grenze1    
                            Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(11),Farbe(11),Farbe(11),Farbe(11))
                             ElseIf feld3_interpoliert3(ky,kx)   =< Grenze2 And feld3_interpoliert3(ky,kx) >Grenze1
                               Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(10),Farbe(10),Farbe(10),Farbe(10))
                               ElseIf feld3_interpoliert3(ky,kx)   =< Grenze3 And feld3_interpoliert3(ky,kx) >Grenze2
                                Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(9),Farbe(9),Farbe(9),Farbe(9))
                                 ElseIf feld3_interpoliert3(ky,kx)   =< Grenze4 And feld3_interpoliert3(ky,kx) >Grenze3
                                  Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(8),Farbe(8),Farbe(8),Farbe(8))
                                   ElseIf feld3_interpoliert3(ky,kx)   =< Grenze5 And feld3_interpoliert3(ky,kx) >Grenze4
                                    Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(7),Farbe(7),Farbe(7),Farbe(7))
                                     ElseIf feld3_interpoliert3(ky,kx)   =< Grenze6 And feld3_interpoliert3(ky,kx) >Grenze5
                                      Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(6),Farbe(6),Farbe(6),Farbe(6))
                                       ElseIf feld3_interpoliert3(ky,kx)   =< Grenze7 And feld3_interpoliert3(ky,kx) >Grenze6
                                        Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(5),Farbe(5),Farbe(5),Farbe(5))
                                         ElseIf feld3_interpoliert3(ky,kx)   =< Grenze4 And feld3_interpoliert3(ky,kx) >Grenze7
                                          Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(4),Farbe(4),Farbe(4),Farbe(4))
                                           ElseIf feld3_interpoliert3(ky,kx)   =< Grenze9 And feld3_interpoliert3(ky,kx) >Grenze4
                                            Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(3),Farbe(3),Farbe(3),Farbe(3))
                                             ElseIf feld3_interpoliert3(ky,kx)   =< Grenze10 And feld3_interpoliert3(ky,kx) >Grenze9
                                              Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(2),Farbe(2),Farbe(2),Farbe(2)) 
                                               ElseIf feld3_interpoliert3(ky,kx)   =< Grenze11 And feld3_interpoliert3(ky,kx) >Grenze10
                                                Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(1),Farbe(1),Farbe(1),Farbe(1))
                                                 ElseIf feld3_interpoliert3(ky,kx) > Grenze11
                                                  Sprite3D_DrawBox2D(4*kx,4*ky,4,4,Farbe(0),Farbe(0),Farbe(0),Farbe(0))
                          
                           EndIf
                        Next
                      Next
                      

  Sprite3D_Stop2DDrawing() 
  Stop3D()


;Grafikmodus Sprites  
  ElseIf Grafikmodus = 2
     StartDrawing(SpriteOutput(#Sprite)) 
       
                       For ky = 0 To 120 
                        For kx = 0 To 120
                               
                           If feld3_interpoliert3(ky,kx)   = < Grenze1    
                            DisplaySprite(#SpriteF11,4*kx,4*ky)
                             ElseIf feld3_interpoliert3(ky,kx)   =< Grenze2 And feld3_interpoliert3(ky,kx) >Grenze1
                               DisplaySprite(#SpriteF10,4*kx,4*ky)
                               ElseIf feld3_interpoliert3(ky,kx)   =< Grenze3 And feld3_interpoliert3(ky,kx) >Grenze2
                                DisplaySprite(#SpriteF9,4*kx,4*ky)
                                 ElseIf feld3_interpoliert3(ky,kx)   =< Grenze4 And feld3_interpoliert3(ky,kx) >Grenze3
                                  DisplaySprite(#SpriteF8,4*kx,4*ky)
                                   ElseIf feld3_interpoliert3(ky,kx)   =< Grenze5 And feld3_interpoliert3(ky,kx) >Grenze4
                                    DisplaySprite(#SpriteF7,4*kx,4*ky)
                                     ElseIf feld3_interpoliert3(ky,kx)   =< Grenze6 And feld3_interpoliert3(ky,kx) >Grenze5
                                      DisplaySprite(#SpriteF6,4*kx,4*ky)
                                       ElseIf feld3_interpoliert3(ky,kx)   =< Grenze7 And feld3_interpoliert3(ky,kx) >Grenze6
                                        DisplaySprite(#SpriteF5,4*kx,4*ky)
                                         ElseIf feld3_interpoliert3(ky,kx)   =< Grenze4 And feld3_interpoliert3(ky,kx) >Grenze7
                                          DisplaySprite(#SpriteF4,4*kx,4*ky)
                                           ElseIf feld3_interpoliert3(ky,kx)   =< Grenze9 And feld3_interpoliert3(ky,kx) >Grenze4
                                            DisplaySprite(#SpriteF3,4*kx,4*ky)
                                             ElseIf feld3_interpoliert3(ky,kx)   =< Grenze10 And feld3_interpoliert3(ky,kx) >Grenze9
                                              DisplaySprite(#SpriteF2,4*kx,4*ky)
                                               ElseIf feld3_interpoliert3(ky,kx)   =< Grenze11 And feld3_interpoliert3(ky,kx) >Grenze10
                                                DisplaySprite(#SpriteF1,4*kx,4*ky)
                                                 ElseIf feld3_interpoliert3(ky,kx) > Grenze11
                                                  DisplaySprite(#SpriteF0,4*kx,4*ky)
                          
                           EndIf
                        Next
                      Next   
                        
StopDrawing()                   
FlipBuffers()



  
  
 Else
   MessageRequester("Fehler","Selektierungsfehler Grafikmodus" ,0) 
 EndIf  
  
  
  FlipBuffers()        
             
EndProcedure





;*************************************************************************************************
Procedure feld_interpolieren121x121()
  
  m.w 
  m=0

;Auf 31x31 
 ;Interpolieren entlang der x-Achse
  
    For x = 0 To 15
      For y = 0 To 15 
        feld_interpolierty1(x,m)=feldnormiert(x,y)
        m=m+1
        feld_interpolierty1(x,m)=(feldnormiert(x,y)+feldnormiert(x,y+1))/2
        m=m+1
      Next   
      feld_interpolierty1(x,m)=feldnormiert(x,15)
      m=0
    Next
    
;Interpolieren entlang der y-Achse
    m=0
    For y = 0 To 30 
      For x = 0 To 15
        feld_interpoliert1(m,y)=feld_interpolierty1(x,y)
        m=m+1
        feld_interpoliert1(m,y)=(feld_interpolierty1(x,y)+feld_interpolierty1(x+1,y))/2
        m=m+1
      Next   
      feld_interpoliert1(m,y)=feld_interpolierty1(x,31)
      m=0
    Next 

;Auf 61x61
  ;Interpolieren entlang der x-Achse
 
  
  For x = 0 To 30
    For y = 0 To 30 
      feld2_interpolierty2(x,m)=feld_interpoliert1(x,y)
      m=m+1
      feld2_interpolierty2(x,m)=(feld_interpoliert1(x,y)+feld_interpoliert1(x,y+1))/2
      m=m+1
    Next   
    feld2_interpolierty2(x,m)=feld_interpoliert1(x,30)
    m=0
  Next
  
  ;Interpolieren entlang der y-Achse
  m=0
  For y = 0 To 60
    For x = 0 To 30
      feld2_interpoliert2(m,y)=feld2_interpolierty2(x,y)
      m=m+1
      feld2_interpoliert2(m,y)=(feld2_interpolierty2(x,y)+feld2_interpolierty2(x+1,y))/2
      m=m+1
    Next   
    feld2_interpoliert2(m,y)=feld2_interpolierty2(x,31)
    m=0
  Next 
 
 
 
;Auf 121x121 
  ;Interpolieren entlang der x-Achse
  
  For x = 0 To 60
    For y = 0 To 60 
      feld3_interpolierty3(x,m)=feld2_interpoliert2(x,y)
      m=m+1
      feld3_interpolierty3(x,m)=(feld2_interpoliert2(x,y)+feld2_interpoliert2(x,y+1))/2
      m=m+1
    Next   
    feld3_interpolierty3(x,m)=feld2_interpoliert2(x,60)

    m=0
  Next
  
  ;Interpolieren entlang der y-Achse
  m=0
  For y = 0 To 120
    For x = 0 To 60
      feld3_interpoliert3(m,y)=feld3_interpolierty3(x,y)
      m=m+1
      feld3_interpoliert3(m,y)=(feld3_interpolierty3(x,y)+feld3_interpolierty3(x+1,y))/2
      m=m+1
    Next   
    feld3_interpoliert3(m,y)=feld3_interpolierty3(x,61)
    m=0
  Next 
  

EndProcedure


Procedure feld_erstellen()

    For x = 0 To 15 
      For y = 0 To 15 
        feldnormiert(x,y)=Random(300)
      Next
    Next   

EndProcedure



;*************************************************************************************************

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf
InitSprite3D() 
If OpenWindow(#Window,0,0,610,510,"Speed Test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Window))
    ButtonGadget(#Button1,540, 10,60,20,"Box")
    ButtonGadget(#Button2,540, 40,60,20,"Sprite3D")
    ButtonGadget(#Button3,540, 70,60,20,"SpriteResize")
    TextGadget  (#Text1,540,110,60,30,"")
  EndIf
  


  If OpenWindowedScreen(WindowID(#Window),5,5,484,484,0,0,0)
    CreateSprite(#Sprite,484,484)
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf

EndIf

  ;******************** Timer ***********************************
   SetTimer_(WindowID(#Window), #TIMER, 1000, 0)   
   CreateSprite(#SpriteF0, 4, 4)
   CreateSprite(#SpriteF1, 4, 4)
   CreateSprite(#SpriteF2, 4, 4)
   CreateSprite(#SpriteF3, 4, 4)
   CreateSprite(#SpriteF4, 4, 4)
   CreateSprite(#SpriteF5, 4, 4)
   CreateSprite(#SpriteF6, 4, 4)
   CreateSprite(#SpriteF7, 4, 4)
   CreateSprite(#SpriteF8, 4, 4)
   CreateSprite(#SpriteF9, 4, 4)
   CreateSprite(#SpriteF10, 4, 4)
   CreateSprite(#SpriteF11, 4, 4)
   StartDrawing(SpriteOutput(#SpriteF0))
     Box(0,0,4,4,Farbe(0))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF1))
     Box(0,0,4,4,Farbe(1))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF2))
     Box(0,0,4,4,Farbe(2))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF3))
     Box(0,0,4,4,Farbe(3))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF4))
     Box(0,0,4,4,Farbe(4))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF5))
     Box(0,0,4,4,Farbe(5))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF6))
     Box(0,0,4,4,Farbe(6))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF7))
     Box(0,0,4,4,Farbe(7))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF8))
     Box(0,0,4,4,Farbe(8))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF9))
     Box(0,0,4,4,Farbe(9))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF10))
     Box(0,0,4,4,Farbe(10))
   StopDrawing()
   StartDrawing(SpriteOutput(#SpriteF11))
     Box(0,0,4,4,Farbe(11))
   StopDrawing()



Repeat
  Event.l = WindowEvent()    
  
  If Event = #PB_Event_Gadget
    Gadget  = EventGadget()  

    Select Gadget
        
      Case #Button1
        Grafikmodus = 1
        SetGadgetText(#Text1,"Grafikmodus "+Str(Grafikmodus))
        
      Case #Button2
        Grafikmodus = 0
        SetGadgetText(#Text1,"Grafikmodus "+Str(Grafikmodus))

      Case #Button3
        Grafikmodus = 2
        SetGadgetText(#Text1,"Grafikmodus "+Str(Grafikmodus))
        
    EndSelect
  
  Else
    If Event = #WM_TIMER And EventwParam()=#TIMER  
      SetGadgetText(#Text1, Str(FP10S_Counter))
      FP10S_Counter = 0  
    EndIf 
    feld_erstellen()   
    feld_interpolieren121x121()  
    feld_zeichnen121x121() 
    Delay(1)
  EndIf

Until Event = #PB_Event_CloseWindow 

End                               


PS1: Ist wirklich ein Spitzenforum hier... Nur durch die Beantwortung der blödesten Fragen kann auch mir geholfen werden :allright:

PS2: Bitte gerne im Code rumspielen und uploaden. Hinweise wie ich etwas umsetzen soll sind zwar auch willkommen, aber vielleicht nicht immer vom Erfolg gekrönt... :oops:

Verfasst: 01.07.2007 18:22
von Kekskiller
Reicht es dir auch, wenn ich auf die schnelle ne eigene Drawing-Routine schreibe? Der Code scheint mit doch etwas unbeholfen um zu editieren.

Verfasst: 01.07.2007 18:26
von Kaeru Gaman
immerhin ist der code komplett und lauffähig.
dafür ein lob!

Verfasst: 01.07.2007 20:10
von r7mk4
:oops: Danke für das Lob!!!
Ist halt hier und da "rausgeklaut" und entsprechend modifiziert.

Wie gesagt: Eigene Routinen sind sehr willkommen. Bitte aber selbstständig lauffähig.
Muß ja auch mit deiner Arbeit was anfangen können :lol:

Danke im voraus!!!

Verfasst: 01.07.2007 21:58
von Kekskiller
Ein Entwurf von meiner Seite:

Code: Alles auswählen

Structure RGBA
  r.c
  g.c
  b.c
  a.c
EndStructure

Structure RGBA_Float
  r.f
  g.f
  b.f
  a.f
EndStructure

Procedure DrawInterpolatedBox(x.w,y.w, w.w,h.w, pxsize.w, *col1.RGBA, *col2.RGBA, *col3.RGBA,*col4.RGBA)
  
  ; farbübergänge ausrechnen
  Protected g1to2.RGBA_Float, g3to4.RGBA_Float, g4to1.RGBA_Float
  
  g1to2\r = (*col2\r/255 - *col1\r/255) / w
  g1to2\g = (*col2\g/255 - *col1\g/255) / w
  g1to2\b = (*col2\b/255 - *col1\b/255) / w
  
  g3to4\r = (*col3\r/255 - *col4\r/255) / w
  g3to4\g = (*col3\g/255 - *col4\g/255) / w
  g3to4\b = (*col3\b/255 - *col4\b/255) / w
  
  g4to1\r = (*col4\r/255 - *col1\r/255) / h
  g4to1\g = (*col4\g/255 - *col1\g/255) / h
  g4to1\b = (*col4\b/255 - *col1\b/255) / h
  
  
  ; da purebasic blöderweise keine casts kann, cheate ich ein wenig
  Protected color_dest.RGBA ; <- endgültige farbe
  Protected *cd.long ; <- pointer auf endgültige farbe
  *cd = @color_dest ; pointer zuweisen, um später schnell draufzugreifen zu können...
  
  
  ; rechtecksbereich durchgehen und farbübergänge zeichnen
  For zy = 0 To h-1
    
    ; startfarbe der aktuellen zeile errechnen
    Protected c.RGBA_Float
    c\r = (*col1\r/255) + g4to1\r * zy
    c\g = (*col1\g/255) + g4to1\g * zy
    c\b = (*col1\b/255) + g4to1\b * zy
    
    ; alpha-anteile von oberem u. unterem farbübergang errechnen
    Protected a1.f, a2.f
    a1 = zy/h
    a2 = 1.0 - a1
    
    For zx = 0 To w-1
      
      c\r + g1to2\r * a2 + g3to4\r * a1
      c\g + g1to2\g * a2 + g3to4\g * a1
      c\b + g1to2\b * a2 + g3to4\b * a1
      
      color_dest\r = c\r * 255
      color_dest\g = c\g * 255
      color_dest\b = c\b * 255
      
      Box(x+zx*pxsize,y+zy*pxsize, pxsize,pxsize, *cd\l)
      
    Next
    
  Next
  
  
EndProcedure

;------------------------------------------------------------------------------------------------------------------------------

; fenster öffnen...
OpenWindow(0, 0,0, 640,480, "interpolation test", #PB_Window_ScreenCentered|#PB_Window_TitleBar|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0, 0,0, WindowWidth(0),WindowHeight(0), 0, #PB_Image_Border)

; enstellungen...
Global field_w.w, field_h.w, block_width.w, block_height.w, pixel_zoom.w
field_w = 20
field_h = 20
block_width = 5
block_height = 5
pixel_zoom = 4

; vorbereiten...
Global Dim colors.l(field_w-1,field_h-1)

Global image_w.w, image_h.w, real_block_width.w, real_block_height.w, image_w.w,image_h.w
real_block_width  = block_width * pixel_zoom
real_block_height = block_height * pixel_zoom
image_w = (field_w - 1) * real_block_width
image_h = (field_h - 1) * real_block_height

CreateImage(0, image_w, image_h, #PB_Image_DisplayFormat)

;------------------------------------------------------------------------------------------------------------------------------

; paar funktionen...

Procedure Randomize()
  
  For zy.l = 0 To field_h-1
    For zx.l = 0 To field_w-1
      colors(zx,zy) = Random($ffffff)
    Next
  Next
  
EndProcedure

Procedure DrawArray()
  
  For zy.l = 0 To field_h-2
    For zx.l = 0 To field_w-2
      DrawInterpolatedBox(zx*real_block_width,zy*real_block_height, block_width,block_height, pixel_zoom, @colors(zx,zy), @colors(zx+1,zy), @colors(zx+1,zy+1), @colors(zx,zy+1))
    Next
  Next
  
EndProcedure

;------------------------------------------------------------------------------------------------------------------------------

; hauptschleife...

Global time.l, fps.l

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect
  Randomize()
  StartDrawing(ImageOutput(0))
    time = ElapsedMilliseconds()
    DrawArray()
    fps = ElapsedMilliseconds() - time
    If fps = 0
      SetWindowTitle(0, "FPS: 60+")
    Else
      fps = 1000 / fps
    SetWindowTitle(0, "FPS: " + Str(fps))
    EndIf
  StopDrawing()
  SetGadgetState(0, ImageID(0))
  Delay(1)
ForEver
Könnt ein wenig mit den Einstellungen rumspielen, der größte Speedfresser ist immer noch die Box-/bzw. Plot-Routine. Ich könnte eine Variante machen, die direkt auf den Grafikspeicher zugreift, aber darauf hab ich heute keinen Bock mehr. Grafikprogrammierung mit PB ist mir auf die Dauer zu schreiblastig.

Btw: Das ist meine eigene Variante von Interpolierung, dieser ganze theoretische Müll auf Wikipedia ist was mit mathematische Weicheier, wie ich finde. Unglaublich, dass jemand solch überkandidelte Berechnungen tatsächlich in Echtzeit einsetzt...

Verfasst: 01.07.2007 22:40
von r7mk4
Btw: Das ist meine eigene Variante von Interpolierung, dieser ganze theoretische Müll auf Wikipedia ist was mit mathematische Weicheier, wie ich finde. Unglaublich, dass jemand solch überkandidelte Berechnungen tatsächlich in Echtzeit einsetzt...
:allright: aber die haben bestimmt nen Doktor...ähh. Master :lol:

Ich werde mir in Ruhe den Code zu Gemüte führen müssen (heute nichtmehr)...


Vielen vielen Dank (vorerst) mal!!! :allright:

Verfasst: 02.07.2007 19:26
von r7mk4
Hi,

folgendes wäre (wenn möglich) zu ändern:

-ich interpoliere Werte und weise denen dann die Farbwerte zu.
Damit erreiche ich eine "isobare" Darstellung ähnlich einer Wetterkarte.
Es werden also keine Farbverläufe im eigentlichen Sinne erstellt.

-ein Geschwindigkeitsvorteil ist zwar gegeben, allerdings hoffte ich so auf 40fps (Feld: 16x16) zu kommen. Meinst du das ist möglich?

Gruß
R7mk4

Verfasst: 03.07.2007 20:10
von r7mk4
Ich habe mal deine Aussage zu Herzen genommen:
der größte Speedfresser ist immer noch die Box-/bzw. Plot-Routine.
Völlig richtig.

Mein Algo macht locker 45fps (und ich versteh ihn ;-) )

Das langsame ist das Zeichnen!!! :roll:

Wäre jemand so gnädig und gibt mir nen Code, der aus dem Speicher sehr schnell "malen" kann???

Array 121x121 mit Zuweisung einer Farbe durch den Wert innerhalb eines Bereichs (e.g. 0-50 ->rot; 50-100-> grün, 100-250->gelb)

Vielen Dank Jungs :allright:

PS: Ich mag diesen Allright-Smiley ohne Ende!!!!