Programm : XY_Plott_Skaliert V1.0 ( PureBasic V4.51 )

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
JuL
Beiträge: 2
Registriert: 25.07.2011 22:30
Computerausstattung: Windows XP

Programm : XY_Plott_Skaliert V1.0 ( PureBasic V4.51 )

Beitrag von JuL »

Programm : XY_Plott_Skaliert V1.0 ( PureBasic V4.51 / Windows XP )

Dies ist ein Programm mit dem sich beliebige Werte oder Funktionen in einer 2 dimensionalen (X/Y)-Grafik darstellen und Beschriften lassen.

Die X- und Y-Achsen können dabei frei skaliert werden. Die Kurven werden entsprechend angepasst. Änderbar im Beispiel über Puldown oder PopUp.

Das Hauptfenster kann in verschiedenen Grössen geöffnet werden.
Die Grafik(en) werden entsprechend geändert.

Es lassen sich mehrere Grafiken im Hauptfenster darstellen ( im Beispiel bis zu 4 )

Der Hintergrund kann invertiert werden.

Die Fensterverwaltung von Windows(XP) wird verwendet. ( Minimize / Refresh ... ).

Zum Zeichnen der Grafik/Kurven verwendet man nur zwei Funktionen:

1. Move (Nr,X,Y) setzt den Anfangspunkt einer Linie ( der Nummer Grafik/Kurve )
2. Draw (Nr,X,Y,Farbe) zeichnet eine Linie von der vorherigen zu dieser Position.


Die Werte können ganz einfach in einer Schleife berechnet oder eingelesen werden.

Beispiel für die 2. Kurve

Code: Alles auswählen

        Y.f=(-800*-800)/410-790
        Ok=Move(2,-800,Y)
        
        For X=-800 To 800 
            Y.f=(X*X)/410-790
            OK=Draw(2,X,Y.f,Farbe)
        Next X
[/size]Anzahl der Grafiken, Beschriftung, Position, Göße, Unterteilung und Skalierung des Rasters wird in der Procedure Int_Ausgabe festgelegt.

Beispiel für die 1. und 2. Kurve:

Code: Alles auswählen


Procedure Init_Ausgabe()

    ;   Alle Angaben  Raster-Größe, Raster-Position  in  %  der Haupt-Fenster Größe. 
  
    Erste_Grafik=1
    Letzte_Grafik=4
    
;--------- Zuweisung für die 1.Grafk ----------------

    Ausgabe(1)\Raster_x_pos=8
    Ausgabe(1)\Raster_breite=40
    Ausgabe(1)\X_teilung=8
    Ausgabe(1)\X_nachkomma=2
    Ausgabe(1)\Raster_y_pos=5
    Ausgabe(1)\Raster_hoehe=40
    Ausgabe(1)\Y_teilung=10
    Ausgabe(1)\Y_nachkomma=0
    Ausgabe(1)\Raster_farbe=150
    Ausgabe(1)\Rahmen_farbe=255      
    Ausgabe(1)\Fenster_Titel=" Bezeichnung der Grafik-Ausgabe 1 "
    Ausgabe(1)\X_links=-3.6
    Ausgabe(1)\X_rechts=3.6
    Ausgabe(1)\Y_unten=-600
    Ausgabe(1)\Y_oben=600
     
;--------- Zuweisung für die 2.Grafk ----------------
   
    Ausgabe(2)\Raster_x_pos=57
    Ausgabe(2)\Raster_breite=40
    Ausgabe(2)\X_teilung=8   
    Ausgabe(2)\Raster_y_pos=5
    Ausgabe(2)\Raster_hoehe=40
    Ausgabe(2)\Y_teilung=8
    Ausgabe(2)\Raster_farbe=150   
    Ausgabe(2)\Rahmen_farbe=255      
    Ausgabe(2)\Fenster_Titel=" Bezeichnung der Grafik-Ausgabe 2"
    Ausgabe(2)\X_links=-800
    Ausgabe(2)\X_rechts=800
    Ausgabe(2)\Y_unten=-800
    Ausgabe(2)\Y_oben=800

;   (   und so weiter für weitere Kurven )
[/size]

Screenshot einer Anwendung : http://juergen.webspaces.vektorrausch.n ... kblick.png

Hier das komplette Programm :

Code: Alles auswählen

Global Fenster_x_pos,Fenster_y_pos,Fenster_breite,Fenster_hoehe,HG_farbe,X_alt.f,Y_alt.f,Ende,Neu_Start,Hintergrund,Erste_Grafik,Letzte_Grafik

#Haupt_Fenster=1
#Fenster_Inhalt=2
#Menue_Fenster=3
#PopUp_Fenster=4

Structure Grafik_Format
    Raster_x_pos.f
    Raster_breite.f
    X_teilung.f 
    X_nachkomma.b  
    Raster_y_pos.f
    Raster_hoehe.f
    Y_teilung.f
    Y_nachkomma.b
    Raster_farbe.f
    Rahmen_farbe.f
    Fenster_Titel.s
    X_rechts_pos.f
    X_links_pos.f
    Y_unten_pos.f
    Y_oben_pos.f
    X_links.f
    X_rechts.f
    Y_unten.f
    Y_oben.f
EndStructure

Global Dim Ausgabe.Grafik_Format(4)

Procedure Init_Ausgabe()

    ;   Alle Angaben  Raster-Groesse, Raster-Position  in  %  der Haupt-Fenster-Groesse.
    
    Erste_Grafik=1
    Letzte_Grafik=4
    
    Ausgabe(1)\Raster_x_pos=8
    Ausgabe(1)\Raster_breite=40
    Ausgabe(1)\X_teilung=8
    Ausgabe(1)\X_nachkomma=2
    Ausgabe(1)\Raster_y_pos=5
    Ausgabe(1)\Raster_hoehe=40
    Ausgabe(1)\Y_teilung=10
    Ausgabe(1)\Y_nachkomma=0
    Ausgabe(1)\Raster_farbe=150
    Ausgabe(1)\Rahmen_farbe=255      
    Ausgabe(1)\Fenster_Titel=" Bezeichnung der Grafik-Ausgabe 1 "
    Ausgabe(1)\X_links=-3.6
    Ausgabe(1)\X_rechts=3.6
    Ausgabe(1)\Y_unten=-600
    Ausgabe(1)\Y_oben=600
    
    Ausgabe(2)\Raster_x_pos=57
    Ausgabe(2)\Raster_breite=40
    Ausgabe(2)\X_teilung=8   
    Ausgabe(2)\Raster_y_pos=5
    Ausgabe(2)\Raster_hoehe=40
    Ausgabe(2)\Y_teilung=8
    Ausgabe(2)\Raster_farbe=150   
    Ausgabe(2)\Rahmen_farbe=255      
    Ausgabe(2)\Fenster_Titel=" Bezeichnung der Grafik-Ausgabe 2"
    Ausgabe(2)\X_links=-800
    Ausgabe(2)\X_rechts=800
    Ausgabe(2)\Y_unten=-800
    Ausgabe(2)\Y_oben=800
    
    Ausgabe(3)\Raster_x_pos=8
    Ausgabe(3)\Raster_breite=40
    Ausgabe(3)\X_teilung=8   
    Ausgabe(3)\Raster_y_pos=53
    Ausgabe(3)\Raster_hoehe=40
    Ausgabe(3)\Y_teilung=6
    Ausgabe(3)\Raster_farbe=150   
    Ausgabe(3)\Rahmen_farbe=255      
    Ausgabe(3)\Fenster_Titel=" Bezeichnung der Grafik-Ausgabe 3"
    Ausgabe(3)\X_links=-800
    Ausgabe(3)\X_rechts=800
    Ausgabe(3)\Y_unten=-600
    Ausgabe(3)\Y_oben=600
    
    Ausgabe(4)\Raster_x_pos=57
    Ausgabe(4)\Raster_breite=40
    Ausgabe(4)\X_teilung=10  
    Ausgabe(4)\Raster_y_pos=53
    Ausgabe(4)\Raster_hoehe=40
    Ausgabe(4)\Y_teilung=12
    Ausgabe(4)\Raster_farbe=150   
    Ausgabe(4)\Rahmen_farbe=255      
    Ausgabe(4)\Fenster_Titel=" Kredit :  Restsumme über Zeit ( Jahre ) "
    Ausgabe(4)\X_links=0
    Ausgabe(4)\X_rechts=30
    Ausgabe(4)\Y_unten=0
    Ausgabe(4)\Y_oben=120000
    
EndProcedure



Procedure Init_Ausgabe_xy_neu()

    ;   Alle Angaben  Raster-Groesse, Raster-Position  in  %  der Haupt-Fenster-Groesse.
    
    Erste_Grafik=1
    Letzte_Grafik=4
    
    Ausgabe(1)\Raster_x_pos=8
    Ausgabe(1)\Raster_breite=40
    Ausgabe(1)\X_teilung=7
    Ausgabe(1)\X_nachkomma=0
    Ausgabe(1)\Raster_y_pos=5
    Ausgabe(1)\Raster_hoehe=40
    Ausgabe(1)\Y_teilung=10
    Ausgabe(1)\Y_nachkomma=0
    Ausgabe(1)\Raster_farbe=150
    Ausgabe(1)\Rahmen_farbe=255      
    Ausgabe(1)\Fenster_Titel=" X + Y   Skalierung größer"
    Ausgabe(1)\X_links=-6
    Ausgabe(1)\X_rechts=6
    Ausgabe(1)\Y_unten=-1000
    Ausgabe(1)\Y_oben=1000
    
    Ausgabe(2)\Raster_x_pos=57
    Ausgabe(2)\Raster_breite=40
    Ausgabe(2)\X_teilung=4   
    Ausgabe(2)\Raster_y_pos=5
    Ausgabe(2)\Raster_hoehe=40
    Ausgabe(2)\Y_teilung=4
    Ausgabe(2)\Raster_farbe=150   
    Ausgabe(2)\Rahmen_farbe=255      
    Ausgabe(2)\Fenster_Titel=" X - Skalierung / Raster anders "
    Ausgabe(2)\X_links=-8000
    Ausgabe(2)\X_rechts=8000
    Ausgabe(2)\Y_unten=-800
    Ausgabe(2)\Y_oben=800
    
    Ausgabe(3)\Raster_x_pos=8
    Ausgabe(3)\Raster_breite=40
    Ausgabe(3)\X_teilung=1  
    Ausgabe(3)\Raster_y_pos=53
    Ausgabe(3)\Raster_hoehe=40
    Ausgabe(3)\Y_teilung=2
    Ausgabe(3)\Raster_farbe=150   
    Ausgabe(3)\Rahmen_farbe=255      
    Ausgabe(3)\Fenster_Titel=" Y = Cos(X/20)*X/1.4 "
    Ausgabe(3)\X_links=-800
    Ausgabe(3)\X_rechts=800
    Ausgabe(3)\Y_unten=-1000
    Ausgabe(3)\Y_oben=1000
    
    Ausgabe(4)\Raster_x_pos=57
    Ausgabe(4)\Raster_breite=40
    Ausgabe(4)\X_teilung=6  
    Ausgabe(4)\Raster_y_pos=53
    Ausgabe(4)\Raster_hoehe=40
    Ausgabe(4)\Y_teilung=4
    Ausgabe(4)\Raster_farbe=150   
    Ausgabe(4)\Rahmen_farbe=255      
    Ausgabe(4)\Fenster_Titel=" Kredit :  Restsumme über Zeit ( Jahre ) "
    Ausgabe(4)\X_links=0
    Ausgabe(4)\X_rechts=30
    Ausgabe(4)\Y_unten=0
    Ausgabe(4)\Y_oben=100000
    
EndProcedure

Procedure Init_Ausgabe_eine_Grafik()

    ;   Alle Angaben  Raster-Groesse, Raster-Position  in  %  der Haupt-Fenster-Groesse.
    
    Erste_Grafik=3
    Letzte_Grafik=3

    Ausgabe(3)\Raster_x_pos=10
    Ausgabe(3)\Raster_breite=84
    Ausgabe(3)\X_teilung=1  
    Ausgabe(3)\Raster_y_pos=10
    Ausgabe(3)\Raster_hoehe=80
    Ausgabe(3)\Y_teilung=2
    Ausgabe(3)\Raster_farbe=150   
    Ausgabe(3)\Rahmen_farbe=255      
    Ausgabe(3)\Fenster_Titel=" Y = Cos(X/20)*X/1.4 "
    Ausgabe(3)\X_links=-800
    Ausgabe(3)\X_rechts=800
    Ausgabe(3)\Y_unten=-600
    Ausgabe(3)\Y_oben=600
      
  EndProcedure
  
  Procedure Init_Ausgabe_nichts()
   
    Erste_Grafik=1
    Letzte_Grafik=0
      
EndProcedure

Procedure Warte()  
    MessageRequester("","Pause",#PB_MessageRequester_Ok) 
EndProcedure

Procedure  Hintergrund()
  StartDrawing(ImageOutput(#Fenster_Inhalt))
        FillArea(0,0,RGB(255,255,255),RGB(HG_farbe,HG_farbe,HG_farbe))
    StopDrawing()    
EndProcedure

Procedure Init_Haupt_Fenster()
  
  Titel$="Test Grafik /  Darstellung von Funktionen bei variabler Skalierung/Grafikgröße/Anzahl     ( mit Fensterverwaltung , Menue , PopUp )         (C) Jürgen Lambrecht"
  
  If Fenster_Breite=0
    Fenster_x_pos=3
    Fenster_y_pos=3
    Fenster_breite=1000
    Fenster_hoehe=750
  EndIf
  If Hintergrund=0
      HG_farbe=0    
  Else
      HG_farbe=250      
  EndIf 
    
  OpenWindow(#Haupt_Fenster,Fenster_x_pos,Fenster_y_pos, Fenster_breite,Fenster_hoehe, Titel$, #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)     
  CreateImage(#Fenster_Inhalt, Fenster_breite, Fenster_hoehe)          ; Leeres Bild erzeugen
  OK=Hintergrund()
  If CreateMenu(0, WindowID(#Haupt_Fenster))
     MenuTitle("  Optionen  ")
     MenuItem(1, " Fenster = 1000 x 750  ")
     MenuItem(2, "                   780 x 580  ")
     MenuItem(3, "                   600 x 500  ")
     MenuItem(4, "   Hintergrund   (invers)")
     MenuItem(5, "   Skalierung neu ( 4 Grafiken ) ")
     MenuItem(6, "   Skalierung alt ( 4 Grafiken )"  )
     MenuItem(7, "   Eine Grafik  ")
     MenuItem(8, "     Quit        ")
   EndIf
   If CreatePopupMenu(#PopUp_Fenster)
     MenuItem(21, " Hintergrund   (invers) ")
     MenuItem(22, "  Leeres Fenster ")
     MenuItem(25, "          Quit         ")
  EndIf
EndProcedure

Procedure Beschriftung(Grafik)
  
       Font=Fenster_breite*Ausgabe(Grafik)\Raster_breite/2900
       FontID.l= LoadFont(1,"Arial",Font)
    
       StartDrawing(ImageOutput(#Fenster_Inhalt))
        
       If Hintergrund=0
         Farbe=RGB(250,250,0)
       Else
         Farbe=RGB(90,90,90)         
       EndIf
       
          FrontColor (Farbe)
          DrawingMode(#PB_2DDrawing_Transparent)
          If FontID
            DrawingFont(FontID)
          EndIf
          X=(Ausgabe(Grafik)\X_rechts_pos+Ausgabe(Grafik)\X_links_pos)/2-Len(Ausgabe(Grafik)\Fenster_Titel)*Font/3.2
          Y=Ausgabe(Grafik)\Y_oben_pos-(Font*1.8)         
          DrawText(X,Y,Ausgabe(Grafik)\Fenster_Titel)
       StopDrawing()
          
       Font=Fenster_breite*Ausgabe(Grafik)\Raster_breite/3300
       FontID.l= LoadFont(1,"Arial",Font)
    
       StartDrawing(ImageOutput(#Fenster_Inhalt))
       
       If Hintergrund=0
         Farbe=RGB(250,250,0)
       Else
         Farbe=RGB(0,0,0)         
       EndIf       

          FrontColor (Farbe)
          DrawingMode(#PB_2DDrawing_Transparent)
          If FontID
            DrawingFont(FontID)
          EndIf      
        
          Y_schritt=(Ausgabe(Grafik)\Y_oben_pos-Ausgabe(Grafik)\Y_unten_pos)/Ausgabe(Grafik)\Y_teilung
          Y=Ausgabe(Grafik)\Y_unten_pos-Font*0.8    
          Y_wert=Ausgabe(Grafik)\Y_unten
          Y_wert_schritt=(Ausgabe(Grafik)\Y_oben-Ausgabe(Grafik)\Y_unten)/Ausgabe(Grafik)\Y_teilung
          Repeat            
            Y$=StrF(Y_wert,Ausgabe(Grafik)\Y_nachkomma)
            If Y_wert>=0 
              L.f=Len(Y$)
            Else
               L=Len(Y$)-0.8            
            EndIf
             
            X_links=Ausgabe(Grafik)\X_links_pos
            X=X_links-L*Font/1.3-3
            DrawText(X,Y,Y$)
            Y=Y+Y_schritt 
            Y_wert=Y_wert+Y_wert_schritt
          Until Y<=Ausgabe(Grafik)\Y_oben_pos+Y_schritt
          X_schritt.f=(Ausgabe(Grafik)\X_rechts_pos-Ausgabe(Grafik)\X_links_pos)/Ausgabe(Grafik)\X_teilung
          X_wert.f=Ausgabe(Grafik)\X_links
          X_wert_schritt.f=(Ausgabe(Grafik)\X_rechts-Ausgabe(Grafik)\X_links)/Ausgabe(Grafik)\X_teilung
          Y_unten=Ausgabe(Grafik)\Y_unten_pos 
          Z=0
          Repeat 
            X$=StrF(X_wert,Ausgabe(Grafik)\X_nachkomma)
            L=Len(X$)
            X=Ausgabe(Grafik)\X_Links_pos+Z*X_schritt-L*3.5 
            Y=Y_unten+Font/2 
            DrawText(X,Y,X$)
            Z=Z+1 
            X_wert=X_wert+X_wert_schritt
          Until Z>=Ausgabe(Grafik)\X_teilung+1
          
       StopDrawing() 
EndProcedure

Procedure Grafik_anzeigen()
    StartDrawing (WindowOutput(#Haupt_Fenster))               
      ImageGadget(#Haupt_Fenster,  0, 0, 130, 100, ImageID(#Fenster_Inhalt))
    StopDrawing() 
EndProcedure   
                            
Procedure Raster(Grafik)
    Links=Fenster_breite*Ausgabe(Grafik)\Raster_x_pos/100
    Ausgabe(Grafik)\X_links_pos=Links
    Rechts=Fenster_breite*Ausgabe(Grafik)\Raster_breite/100+Links
    Ausgabe(Grafik)\X_rechts_pos=Rechts
    Oben=Fenster_hoehe*Ausgabe(Grafik)\Raster_y_pos/100
    Ausgabe(Grafik)\Y_oben_pos=Oben
    Unten=Fenster_hoehe*Ausgabe(Grafik)\Raster_hoehe/100+Oben    
    Ausgabe(Grafik)\Y_unten_pos=Unten
    Wert=Ausgabe(Grafik)\Raster_Farbe
    Farbe=RGB(Wert,Wert,Wert)     
        StartDrawing(ImageOutput(#Fenster_Inhalt))
            Y1.f=Oben
            Y_schritt.f=(Unten-Oben)/Ausgabe(Grafik)\Y_teilung
            Repeat  
                For X1=Links To Rechts Step 2
                    Plot (X1,Y1,Farbe)
                Next X1
                Y1=Y1+Y_schritt
            Until Y1>=Unten+Y_schritt/10
            X2.f=Links
            X_schritt.f=(Rechts-Links)/Ausgabe(Grafik)\X_teilung
            Repeat
                For Y2=Oben To Unten Step 2
                    Plot (X2,Y2,Farbe)
                Next Y2 
                X2=X2+X_schritt       
            Until X2>=(Rechts+X_schritt/10)   
            Wert=Ausgabe(Grafik)\Rahmen_Farbe
            Farbe=RGB(Wert,Wert,Wert)
            Line(Links,Unten,Rechts-Links,0,Farbe)    
            Line(Links,Oben,Rechts-Links,0,Farbe)    
            Line(Links,Oben,0,Unten-Oben,Farbe)    
            Line(Rechts,Oben,0,Unten-Oben,Farbe)    
    StopDrawing()
EndProcedure

Procedure Bild_neu_aufbauen(WindowID, Message, lParam, wParam)
  If Message = #WM_PAINT                                           ; Nachricht von Windows wenn Fenster zerstört 
    StartDrawing(WindowOutput(#Haupt_Fenster))                               ; Bild wieder
        DrawImage(#Fenster_Inhalt, 0, 0)                                       ; in Fenster
    StopDrawing()                                                            ; anzeigen
  EndIf  
  ProcedureReturn #PB_ProcessPureBasicEvents   ; Rückgabe an Windows
EndProcedure

Procedure.f X_position(Grafik,X.f) 
    X_pixel=Ausgabe(Grafik)\X_rechts_pos-Ausgabe(Grafik)\X_links_pos
    X_offset.f=X-Ausgabe(Grafik)\X_links
    X_breite.f=Ausgabe(Grafik)\X_rechts-Ausgabe(Grafik)\X_links
    X_faktor.f=X_offset/X_breite
    X_pos.f=Ausgabe(Grafik)\X_links_pos+X_pixel*X_faktor
ProcedureReturn X_pos.f
EndProcedure

Procedure.f Y_position(Grafik,Y.f) 
    Y_pixel.f=Ausgabe(Grafik)\Y_oben_pos-Ausgabe(Grafik)\Y_unten_pos
    Y_offset.f=Y-Ausgabe(Grafik)\Y_unten
    Y_breite.f=Ausgabe(Grafik)\Y_oben-Ausgabe(Grafik)\Y_unten
    Y_faktor.f=Y_offset/Y_breite
    Y_pos.f=Ausgabe(Grafik)\Y_unten_pos+Y_pixel*Y_faktor
ProcedureReturn Y_pos.f
EndProcedure

Procedure Move(Grafik,X.f,Y.f)
    X_pos=X_position(Grafik,X)
    Y_pos=Y_position(Grafik,Y)
    X_alt=X_pos
    Y_alt=Y_pos       
EndProcedure

Procedure Draw(Grafik,X.f,Y.f,Farbe)
    X_pos.f=X_position(Grafik,X.f)
    Y_pos.f=Y_position(Grafik,Y.f)
    StartDrawing(ImageOutput(#Fenster_Inhalt))
        LineXY(X_alt.f,Y_alt.f,X_pos.f,Y_pos.f,Farbe)
    StopDrawing()
    X_alt.f=X_pos.f
    Y_alt.f=Y_pos.f 
EndProcedure

Procedure Kurve_1()
  
        If Hintergrund=0
          Farbe=RGB(0,255,0)
        Else
          Farbe=RGB(0,180,0)          
        EndIf  
        X_nachkomma=1
        Y_nachkomma=0


        X.f=-3.6 
        ; X.f=Ausgabe(1)\X_links  ;  Zur Übernahme aus Init_Ausgabe
        X_schritt.f=(7.2)/1000
        ; X_schritt.f=(Ausgabe(1)\X_rechts-Ausgabe(1)\X_links)/1000  ;  Zur Übernahme aus Init_Ausgabe
        Y_wert=X*X*X*X*X
        OK=Move(1,X,Y_wert) 
        
        While X<=3.6
            Y_wert=X*X*X*X*X
            OK=Draw(1,X,Y_wert,Farbe)
            X=X+X_schritt
        Wend
          
EndProcedure

Procedure Kurve_2()
  
         If Hintergrund=0
          Farbe=RGB(255,0,0)
        Else
          Farbe=RGB(220,0,0)
        EndIf   
        X_nachkomma=0
        
        Y.f=(-800*-800)/410-790
        Ok=Move(2,-800,Y)
        
        For X=-800 To 800 
            Y.f=(X*X)/410-790
            OK=Draw(2,X,Y.f,Farbe)
        Next x
          
EndProcedure

Procedure Kurve_3()
  
         If Hintergrund=0
          Farbe=RGB(0,255,255)
        Else
          Farbe=RGB(0,100,200)          
        EndIf  
        
        X.f=-800
        ; X.f=Ausgabe(3)\X_links  ;  Zur Übernahme aus Init_Ausgabe
        X_Max.f=800
        ; X_max=Ausgabe(3)\X_rechts  ;  Zur Übernahme aus Init_Ausgabe
        X_schritt.f=(X_max-X)/2000
        Y.f=Cos(X/20)*X/1.4
        Ok=Move(3,X,Y)
        
        While X<=X_max 
            Y.f=Cos(X/20)*X/1.4
            OK=Draw(3,X,Y.f,Farbe)
            X=X+X_schritt
        Wend
          
EndProcedure

Procedure Kurve_4()
  
        Summe=120000
        Zins=7
        Rate=Summe*(Zins+1)/1200
        Ok=Move(4,0,Summe)
        Farbe=RGB(230,140,0)
        
        For Monat=0 To 360
            Zinsen=Summe*Zins/1200
            Summe=Summe-Rate+Zinsen
            If Summe<0 : Summe=0 : EndIf
            Jahr.f=Monat/12
            If Summe>= Ausgabe(4)\Y_oben : Ok=Move(4,Jahr,Summe) : EndIf 
            If Summe<= Ausgabe(4)\Y_oben : OK=Draw(4,Jahr,Summe,Farbe) : EndIf
       Next Monat
          
EndProcedure


Procedure Ereignis_Abfrage(EventID)
  Ende=0
  Neu_Start=0
  Hintergrund_neu=0

  If  EventID = #WM_RBUTTONDOWN : DisplayPopupMenu(#PopUp_Fenster, WindowID(#Haupt_Fenster)) : EndIf    
               
   If EventID =  #PB_Event_Menu  
          Neu_Start=1
          Select EventMenu()
                Case 1 
                    Fenster_breite=1000
                    Fenster_hoehe=750
                Case 2 
                    Fenster_breite=780
                    Fenster_hoehe=580
                Case 3
                    Fenster_breite=600
                    Fenster_hoehe=500 
                 Case 4,21
                   Hintergrund_neu=1
                   If Hintergrund=0 And Hintergrund_neu=1
                      Hintergrund=1
                      Hintergrund_neu=0
                   EndIf
                   If Hintergrund=1 And Hintergrund_neu=1
                      Hintergrund=0
                      Hintergrund_neu=0                    
                    EndIf
                 Case 5
                   Ok=Init_Ausgabe_xy_neu()                     
                  Case 6
                    Ok=Init_Ausgabe()   
                   Case 7
                     Ok=Init_Ausgabe_eine_Grafik()
                   Case 22
                     Ok=Init_Ausgabe_nichts()                     
                   Case 8,25
                   Ende=1
               EndSelect               
    EndIf
           
 EndProcedure
       
;------------------------------------------------------------------------------------------------------------------------------     
;--      Haupt - Programm 
; ------------------------------------------------------------------------------------------------------------------------------     

; Ok=OpenConsole() 

Erste_Grafik=1
Letzte_Grafik=4
Ok=Init_Ausgabe()           ;   Position/Größe der Raster , Achsen Skalierung , Bezeichnung , Einteilung
Repeat 
 
      Ok=Init_Haupt_Fenster()   ;  Festlegen der Fenstergröße , Position , Titel     /    bzw.  Fenster neu

      For Grafik_Nr= Erste_Grafik To Letzte_Grafik     ;   Anzahl der Grafiken
    
          Ok=Raster(Grafik_Nr)
          Ok=Beschriftung(Grafik_Nr)
    
          Select Grafik_Nr
              Case 1
                  Ok=Kurve_1()
              Case 2
                  Ok=Kurve_2()        
              Case 3
                  Ok=Kurve_3()   
              Case 4
                  Ok=Kurve_4()   
          EndSelect 
   
      Next Grafik_Nr
   
      OK=Grafik_anzeigen()
;------------------------------------------------------------------------------------------------------------------------------  
;--      Ereignis und Fenster Verwaltung 
; ------------------------------------------------------------------------------------------------------------------  
      SetWindowCallback(@Bild_neu_aufbauen())
      Repeat
          EventID = WaitWindowEvent()
          Ok=Ereignis_Abfrage(EventID)
      Until EventID = #PB_Event_CloseWindow Or Neu_Start=1

Until EventID=#PB_Event_CloseWindow Or Ende=1 

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

End

Zuletzt geändert von JuL am 02.08.2011 17:43, insgesamt 2-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Programm : XY_Plott_Skaliert V1.0 ( PureBasic V4.51 )

Beitrag von STARGÅTE »

Da brauchte wohl einer n Plot für Mathe :lol:

Netter Code, wobei ich einige Anmerkungen habe:
  • Wenn ein Graph mal nicht in den Wertebereich des Diagramms passt, wird er trotzdem außerhalb gezeichnet (und zerstört dabei die umgebung). Dort solltest du noch eine Prüfung einbauen.
    Ebenso müsstest du den Float-Wert: NaN (not a number) (zB bei Log(-1)) gesondert betrachten, sonst wird nämlich eine Linie bis "sonst wo" gezeichnet.
  • Sowas wie: Line(Links,Unten,Rechts-Links,0,Farbe) wird seit PB 4.?? nicht mehr dargestellt, da eine Line immer eine Höhe/Breite von 1px haben muss (Diskussionen dazu gibs hier im Forum)
BTW: Willkommen im Forum
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
JuL
Beiträge: 2
Registriert: 25.07.2011 22:30
Computerausstattung: Windows XP

Re: Programm : XY_Plott_Skaliert V1.0 ( PureBasic V4.51 )

Beitrag von JuL »

Die (Mathe) – Kurven dienen nur zur Demo und zum Test.
Das ganze hat einen ernsteren Hintergrund als Mathe! Es dient zum Auswerten,Kontrolle und Darstellen von Meßwerten/Meßreihen bzw. Ergebnisse von Berechnungen.

Das Plotten Außerhalb des Rasters ist aus foldenden Gründen absichtlich nicht unterdrückt:

Es ist sichtbar, daß die Werte oder die Skalierung nicht passen.
Der Wert kann selbt begrenzt oder die Ausgabe unterdrückt werden.
Es gibt Anwendungen wo gezielt außerhalb gezeichnet wird.

Z.B.Anzeige von Wetterdaten :http://juergen.webspaces.vektorrausch.n ... kblick.png

Selbstverständlich sollte man die Funktion nur mit gültigen Werten aufrufen.

Der Code wurde mit der Version 3.xx geschrieben und nur an Version 4.xx angepaßt , nicht gezielt nach veralteten Befehlen durchsucht.
ruggyjack
Beiträge: 2
Registriert: 17.02.2017 18:54

Re: Programm : XY_Plott_Skaliert V1.0 ( PureBasic V4.51 )

Beitrag von ruggyjack »

Auch wenn der Thread schon älter ist: das ist ein sehr schönes Beispiel für eine XY-Grafik
Schade dass bis heute kein fertiges XY-Chart-Gadget in PB vorhanden ist!
Antworten