Seite 1 von 1

Diagramm zeichnen

Verfasst: 22.06.2006 11:06
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

Verfasst: 22.06.2006 12:23
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

Diagramm

Verfasst: 22.06.2006 13:20
von Martin66119
Danke für die Hilfe! Funktioniert so

Diagramm

Verfasst: 22.06.2006 15:02
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

Verfasst: 22.06.2006 15:28
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

Verfasst: 22.06.2006 15:53
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

Diagramm

Verfasst: 23.06.2006 07:07
von Martin66119
Vielen Dank für die Hilfe. Das ist es nun was ich gesucht habe.

Martin