Diagramm zeichnen

Fragen und Bugreports zur PureBasic 4.0-Beta.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Diagramm zeichnen

Beitrag von Martin66119 »

Guten morgen an alle!

Ich bin gerade dabei mit über die serielle Schnittstelle Daten einzulesen um diese dann in einem Graph als Messkurve darzustellen (x/y-Achse). Ganz toll wäre es wenn man auch bestimmte Bereiche aus der Darstellung Zoomen könnte.

Wie macht man denn sowas am besten?

Danke
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

in etwa so ?


die Werte für dx und dy sind dann natürlich Deine ausgelesenen
Werte . Zoomen kannst Du indem Du ein wenig mit den

Code: Alles auswählen

;PB4 

Fenster=OpenWindow(#PB_Any,0,0,800,700,"test") 
CreateGadgetList(WindowID(Fenster)) 

ww=WindowWidth(Fenster) ;Fensterbreite merken 
wh=WindowHeight(Fenster) ;Fensterhöhe merken 

ImageGadget(0,0,0,ww,wh,0) ;Imagegadget erzeugen 

CreateImage(0,ww,wh) ;Bild erzeugen 

StartDrawing(ImageOutput(0)) ; Bildmalen 
;Hintergrund weiß 
Box(0,0,ww,wh,RGB(255,255,255)) 

;Koordinatenkreuz in cyan 

Line(0,wh/2,ww,0,RGB(0,255,255)) 
Line(ww/2,0,0,wh,RGB(0,255,255)) 

faktor.f=0.01 
schiebx=0 ;negativ nach links 
schieby=0 ;negativ nach oben 
;die Werte als rote Punkte 
; hier etwas willkürlich ne Formel der Art y=x*x*x 
; bei Dir stehen hier dann die ausgelesenen Werte 
; der Wertebereich 

For x=-ww/faktor/2 To ww/faktor/2 
  
  dx=(x*faktor*2+ww/2)+schiebx 
  y=Pow(x*faktor,3) 
  dy=(wh-(y/100)-wh/2)+schieby 
  
  ;Debug Str(dx)+" "+Str(dy) 
  
  If dx>=0 And dy >=0 And dy <=wh/faktor And dx<=ww/faktor ;Übermalen ist verboten 
    Plot(dx,dy,RGB(255,0,0)) 
  EndIf 
Next 

StopDrawing() 

SetGadgetState(0,ImageID(0)) ;Bild zuweisen 

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow
Zuletzt geändert von bobobo am 22.06.2006 15:29, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Diagramm

Beitrag von Martin66119 »

Danke für die Hilfe! Funktioniert so
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Diagramm

Beitrag von Martin66119 »

Wie ich schon sagte gehts so.

Was ich aber brauche ist eine Routine, die Messwerte ähnlich wie ein Oszilloskop oder auch Messwertschreiber darstellt.

Gibt es hierzu irgendwo Beispiele?

Martin
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

weiß ich nich

aber das kannst Du auch selber häkeln.

Prinzipiell weist Du dem ImageGadget immer ein neues Bild zu.
Das Bild wird nach Bedarf gemalt.
In etwa so. Das folgende malt ein neues Bild und weist dies
dem Imagegadget zu solange Windowevents für das Programm
eintreffen (mit der Maus drüberwackeln)

Code: Alles auswählen

;PB4 

Fenster=OpenWindow(#PB_Any,0,0,800,700,"test") 
CreateGadgetList(WindowID(Fenster)) 

ww=WindowWidth(Fenster) ;Fensterbreite merken 
wh=WindowHeight(Fenster) ;Fensterhöhe merken 

ImageGadget(0,0,0,ww,wh,0) ;Imagegadget erzeugen 

CreateImage(0,ww,wh) ;Bild erzeugen 


Repeat 

StartDrawing(ImageOutput(0)) ; Bildmalen 
;Hintergrund weiß 
Box(0,0,ww,wh,RGB(32,64,32)) 

;Koordinatenkreuz in cyan 

Line(0,wh/2,ww,0,RGB(0,128,0)) 
;Line(ww/2,0,0,wh,RGB(0,255,255)) 

For x=0 To ww 
  
  dx.f=x/5+(Random(10)+40)
  ;y=Pow(x*faktor,3) 
  dy.f=Sin(dx)*(Random(2)+2)+350
  ;dy=(wh-(y/100)-wh/2)+schieby 
  
  ;Debug StrF(dx)+" "+StrF(dy) 
  
  If (dx>=0 And dx <=wh) And (dy >=0 And  dx<=ww) ;Übermalen ist verboten 
    Plot(dx,dy,RGB(255,255,0)) 
  EndIf 
Next 

StopDrawing() 

SetGadgetState(0,ImageID(0)) ;Bild zuweisen IN DER REPEATSCHLEIFE

Until WaitWindowEvent()=#PB_Event_CloseWindow
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

hab mal ne kleine demo dazu gemacht. ich hab ein array genommen, man könnte natürlich auch LL's nehmen. mit der mouse kann man provisorisch vertikal und horizontal zoomen.

Code: Alles auswählen

xZoom.f
yZoom.f
;currPos.l=0
Dim values.l(100)

win=OpenWindow(#PB_Any, 10,10,800,600, "")
imgNr=CreateImage(#PB_Any, 800,600)
imgHd=ImageID(imgNr)


Repeat
  ExamineDesktops()
  xZoom=                    DesktopMouseX()/100.0
  yZoom=  (DesktopHeight(0)-DesktopMouseY())/100.0

  StartDrawing( ImageOutput(imgNr) )
    Box(0,0, 800,600, $303030 )
    For i=1 To 100
      LineXY(   i*xZoom,  600-values(i-1)*yZoom,  i*xZoom+xZoom,  600-values(i)*yZoom ,   $0000ff)
    Next    
  StopDrawing()

  For i=0 To 99
    values(i)=values(i+1)
  Next
  values(100)=values(99)+Random(6)-3
  If values(100)<0 : values(100)=0 : EndIf
  If values(100)>100 : values(100)=100 : EndIf


  StartDrawing( WindowOutput(win) )
    DrawImage( imgHd,0,0)
  StopDrawing()

  event=WindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
  Delay(10)
Until quit
my pb stuff..
Bild..jedenfalls war das mal so.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Diagramm

Beitrag von Martin66119 »

Vielen Dank für die Hilfe. Das ist es nun was ich gesucht habe.

Martin
Gesperrt