Seite 2 von 2

Verfasst: 15.05.2006 10:09
von Kaeru Gaman
unix hat geschrieben:Sry habs fertig und mal ohne Debuger kompiliert.

WOW ist das schnell
siehste wohl...

und so ein aha-erlebnis prägt sich ein. du wirst nie wieder mit debugger performance testen... ;)

Verfasst: 15.05.2006 17:56
von unix
Jo das ist Dumm

Verfasst: 16.05.2006 18:04
von Kekskiller
Zumal muss man nicht immer die Position neu ausrechnen. Wenn man den ganzen Bereich durchgeht (erst y, dann x) braucht man einfach nur die größe eines bildpunktes zurechnen. Bei Linien nur auf der y-Achse brauchst du nur den bufferpitch zu addieren (für jeden Pixel), nach dem du die Adresse einmal ausgerechnet hast. Bei der x-Achse ists die Byte-Größe für einen Pixelpunkt. Nochmal ein Quelltext zur Anregung:

Code: Alles auswählen

Procedure RenderPixelLine(*d.dbuffer, x.l,y.l, height.l, r.l, g.l, b.l)
  Protected bits.l, temp.l, position.l
  
  ;erst vorberechnen, was zu poken, dann eventuell farbwerte tauschen und durchlaufen lassen
  
  Select *d\bufferpixelformat
    Case #PB_PixelFormat_24Bits_RGB  ; 3 Byte pro Pixel (RRGGBB)
      bits = 3
    Case #PB_PixelFormat_24Bits_BGR  ; 3 Byte pro Pixel (BBGGRR)
      bits = 3
      temp = b
      b = r
      r = temp
    Case #PB_PixelFormat_32Bits_RGB  ; 4 Byte pro Pixel (RRGGBB)
      bits = 4
    Case #PB_PixelFormat_32Bits_BGR  ; 4 Byte pro Pixel (BBGGRR)
      bits = 4
      temp = b
      b = r
      r = temp
  EndSelect

  position = *d\buffer + (y * *d\bufferpitch) + (x * bits)

  For zy = 0 To height-1
    PokeB(position+0, r)
    PokeB(position+1, g)
    PokeB(position+2, b)
    
    position + *d\bufferpitch
  Next
  
EndProcedure
Der Quellcoder zeichnet eine vertikale Linie mit entsprechender Farbe und Position auf den Bildschirm.

Verfasst: 02.12.2006 19:00
von Falko
unix hat geschrieben:ja ist ja erst ma eine art engine

mein ziel ist es eine NC Simulation durchzuführen nicht CNC

für unsere Kunzmann Fräse auf der Arbeit

Da es für diese Programmiersparche kein Simulationsprogramm gibt

Ausbilder wird sich freuen :D


Wenn das Programm fertig ist stelle ich ne Demo zur verfügung!
Habe gerade diesen Thread gefunden. Vor kurzem war ich in einem
4-wöchigen Lehrgang für Sinumeric CNC und habe an einem CNC-Simulator
meine Eingaben ausprobieren können. Wenn man sieht wie teuer solche
Programme sind, wäre es sehr schön, wenn sich hier noch ein paar mehr
an soeiner Simulation mit Quelltexte beteiligen könnten. Ich habe vor kurzem mal mit einem Beispiel aus dem englischen Forum etwas herumgespielt und will ebenfalls versuchen, sowas zu machen.
Man kann sich zwar bei http://www.cncsimulator.com/download.shtml eine Freeware laden, doch ist diese sehr eingeschränkt, sodas man sich evt. eine Vollversion kaufen müsste. Hier mal mein minimalversuch auf 2D, Marke einfach nur so :wink:

Code: Alles auswählen

If InitSprite() And InitSprite3D() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
EndIf
Enumeration
 #Sprite_0
 #Sprite_1
 #Text_X
 #Display_X
 #Text_Y
 #Display_Y
EndEnumeration
Global FR.l,WZ.l
Global Radius.d,BreiteX.d,LaengeY.d,x.d,direction.d
 Procedure Fraeser(Durchmesser.l,Col.l)
      Radius=Durchmesser/2
      FR=CreateSprite(#Sprite_0, Durchmesser, Durchmesser,#PB_Sprite_Texture)
      If StartDrawing(SpriteOutput(0))
          Circle(Radius,Radius,Radius,Col)
         StopDrawing()
         CreateSprite3D(#Sprite_0,#Sprite_0)
      EndIf
      ProcedureReturn FR
 EndProcedure 

Procedure Werkstueck(BreiteX,LaengeY,HoeheZ,Col.l)
       CreateSprite(#Sprite_1,BreiteX,LaengeY)
       StartDrawing(SpriteOutput(#Sprite_1))
       Box(0,0,BreiteX,LaengeY,Col)
       StopDrawing()
   
 EndProcedure 
  
  If OpenWindow(0, 0, 0, 640, 480, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(0, 530, 370, 45, 20, "Quit")
      TextGadget(#Text_X,485,12,10,20,"X")
      TextGadget(#Display_X,500,10,50,20,"0.000",#PB_Text_Border )
      TextGadget(#Text_Y,485,32,10,20,"Y")
      TextGadget(#Display_Y,500,30,50,20,"0.000",#PB_Text_Border )
    EndIf
    If OpenWindowedScreen(WindowID(0), 0, 0, 480, 400, 0, 0, 0)
       Fraeser(30,RGB(0,254,0))
       Werkstueck(200,200,20,RGB(0,0,254))
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               End
    EndIf
  EndIf
  
  direction = 2
  
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(1,30,30)
    Start3D()
     DisplaySprite3D(0, x, x,255)
     StartDrawing(SpriteOutput(1))
     If direction=2
       Circle(x-15,x-15,Radius,RGB(col1, Col2, Col3))

     ;ElseIf direction=-2
     ;  Circle(x-15,x-15,10,RGB(0, 0, 255))
     EndIf
     StopDrawing()
    Stop3D()
     x + direction
     SetGadgetText(#Display_X,StrF(x ,0))
     SetGadgetText(#Display_Y,StrF(x ,0))
    If x >200: direction = -2 : EndIf
    If x < 0   :Col1=Random(255):Col2=Random(255):Col2=Random(255): direction = 2 : EndIf
    ;Delay(1)
  ForEver
Vielleicht könnte man das ja auch noch ausbauen. Noch eine weitere Idee
kommt von KG. Mittels POV-Ray könnte man über Pb erstellte Scripts eine 3D-Renderung als Ergebnis erzeugen. Vielleicht sind daran noch mehr interessiert die hier was dazu beitragen möchten.

Grüße ..Falko