Problem mit LineXY, macht Zacken nach links und rechts

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Problem mit LineXY, macht Zacken nach links und rechts

Beitrag von dibro »

Hi,
ich hab ein besch... Problem mit Diagrammkurven.
Ich benutze die Funktion LineXY wie nachstehend dargestellt.
Alle Variablen sind vom Typ Long

Code: Alles auswählen

LineXY(Xalt-Xoffset ,YTempAlt,Xneu-Xoffset ,YTempNeu,$FF00FF)
Manchmal sind in den Kurven horizontale Zacken, die nicht den errechneten x-Werten entsprechen. Mal nach rechts, mal nach links.
Auf meinen Rechner kommt das ab und zu vor. Wenn ich auf dem Firmenrechner arbeite(Citrix-Server), häufig. Und die Kollegen im Betrieb haben das auch, aber Rechner abhängig.
Wer hat so etwas schon mal gehabt und weiß wo es herkommt?
Ich kann leider kein Screenprint posten, weiß nicht wie.
Es handelt sich nur um x-Wert Abweichungen, die y-Werte sind immer o.k.
Wenn ich das Diagramm neu zeichnen lasse, ist der Fehler weg - und dann wieder da und wieder weg .... /:->
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

So etwas ?

Bild
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

>> Ich kann leider kein Screenprint posten, weiß nicht wie.

falls du nicht weißt, wie du einen erstellst, siehe hier
http://www.purebasic.fr/german/viewtopic.php?t=10920
..oder InfanView ect.

falls du keinen webspace hast, findet sich sicherlich jemand, der das mal temporär aufnehmen kann (ich zum beispiel)

ansonsten.. hast du wirklich überprüft, ob die errechneten x-werte stimmen? ich kann mir nicht vorstellen, dass LineXY() hier mit long-werten unfug anstellt...

Code: Alles auswählen

OpenConsole()
;...
;...
x1=Xalt-Xoffset
y1=YTempAlt
x2=Xneu-Xoffset
y2=YTempNeu

PrintN( RSet(Str(x1),8," ")  +  RSet(Str(y1),8," ")  +  RSet(Str(x2),8," ")  +  RSet(Str(y2),8," ") )
LineXY( x1,y1 ,x2,y2, $FF00FF) 

benutzt du irgendwelche PeekX()s, die ihr ziel verfehlen könnten?
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Beitrag von dibro »

Danke für die Mitarbeit, aber ich hab's gefunden. ist aber schon seltsam.
Wohl irgend eine Kompilermacke, die sich nur auf manchen Systemen auswirkt.
Probiert mal

Code: Alles auswählen

;Windows
Enumeration 
#Window_0

EndEnumeration
;Gadgets
Enumeration 
#ImgGad_Diagr
#Panel_0
#Img_Diagr
#Spin_0
EndEnumeration

;Konstanten
#Xoffset =  50
#Yoffset =  250


Procedure Diagramm()
  x.l
  xx.f
  y.f
  Xalt.l = #Xoffset
  Xneu.l
  Yalt.l = #Yoffset
  Yneu.l
dy.f
  If CreateImage(#Img_Diagr,720,500)
    
    If StartDrawing(ImageOutput(#Img_Diagr))
      
      Box(0,0,720,550,$FFFFFF)
      For z = 0 To 4
        For x = 0 To 628
          y = Sin(x/100)* (Val(GetGadgetText(#Spin_0))-150)
          xx = x/3*z
          Yneu=#Yoffset - y
          Xneu=#Xoffset + xx
          LineXY(Xalt,Yalt,Xneu,Yneu,$FF)
          Xalt=Xneu
          Yalt=Yneu
        Next
      Next z
    EndIf
    StopDrawing()
  EndIf
  ImageGadget(#ImgGad_Diagr, 0, 0, 0, 0, ImageID(#Img_Diagr),#PB_Image_Border)
EndProcedure

If OpenWindow(#Window_0, 250, 10, 720, 600,"Zackentest",  #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_SizeGadget | #PB_Window_TitleBar  )
  If CreateGadgetList(WindowID(0))
    SpinGadget(#Spin_0,360,550,50,25,0,300,#PB_Spin_ReadOnly|#PB_Spin_Numeric)
    SetGadgetState(#Spin_0,150)
  EndIf
  
  Diagramm()


  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case #Spin_0
          Diagramm()
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow  
EndIf
Das zeigt die Macken manchmal, am besten den Spin mit der Auf/Ab-Taste durchrollen ==> vertikale Zacken

Wenn ich aber den Kode wie folgt schreibe, ist alles ok :freak:

Code: Alles auswählen

   If StartDrawing(ImageOutput(#Img_Diagr))
      
      Box(0,0,720,550,$FFFFFF)
      dy = (GetGadgetState(#Spin_0)-150)
      For z = 0 To 4
        For x = 0 To 628
          y = Sin(x/100)* dy
          xx = x/3*z
          Yneu=#Yoffset - y
Wie kommt's ???
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das neu erstellen des Bildes ist nicht noetig , da du ja immer
die Flaeche mit Weiss fuellst. Und der Aufruf von GetGadgetState
ist 6918 mal zuviel wie du ja selber schon bemerkt hast.
Unteranderem hast du vergessen Eventtype abzufragen, bei jedem
klick auf das SpinGadget wird dein Bild so 2 mal gemalt.

Besser so :

Code: Alles auswählen

Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case #Spin_0
          If EventType() = #PB_EventType_Change ; <------------
            Diagramm()
          EndIf ; <------------
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow 
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

>> Manchmal sind in den Kurven horizontale Zacken, die nicht den errechneten x-Werten entsprechen
..hab ich mir doch gedacht, dass du eigentlich 'vertikal' und y-werte meinst. aber, macht ja nix.

stimmt, wenn man es vorberechnet, geht es. und es geht seltsamerweise auch, wenn man nur die faktoren vertausch (in der y-berechnung).
ansonsten wird y immer -#IND, also negativ undefiniert. warum weiß ich aber nicht.

Code: Alles auswählen

;Windows
Enumeration
#Window_0

EndEnumeration
;Gadgets
Enumeration
#ImgGad_Diagr
#Panel_0
#Img_Diagr
#Spin_0
EndEnumeration

;Konstanten
#Xoffset =  50
#Yoffset =  250


Procedure Diagramm()
  x.l
  xx.d
  y.d
  Xalt.l = #Xoffset
  Xneu.l
  Yalt.l = #Yoffset
  Yneu.l
dy.d


  If CreateImage(#Img_Diagr,720,500)
   
    If StartDrawing(ImageOutput(#Img_Diagr))
     
      Box(0,0,720,550,$FFFFFF)
      ;val=Val(GetGadgetText(#Spin_0))-150
      For z = 1 To 4
        For x = 0 To 628
        
          ;sin.f=Sin(x/100)
          ;y = sin*val
          
          y = (Val(GetGadgetText(#Spin_0))-150)*Sin(x/100)
          xx = x/3*z
          Yneu=#Yoffset - y
          Xneu=#Xoffset + xx
          LineXY(Xalt,Yalt,Xneu,Yneu,$FF)
          
          If Abs(YNeu-YAlt)>50
            Debug val
            Debug sin
            Debug z
            Debug x
            Debug y
            Debug xx
            Debug XAlt
            Debug YAlt
            Debug XNeu
            Debug YNEU
            Break 2
          EndIf
          
          Xalt=Xneu
          Yalt=Yneu
        Next
      Next z
    EndIf
    StopDrawing()
  EndIf
  ImageGadget(#ImgGad_Diagr, 0, 0, 0, 0, ImageID(#Img_Diagr),#PB_Image_Border)
EndProcedure

If OpenWindow(#Window_0, 50, 100, 720, 600,"Zackentest",  #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_SizeGadget | #PB_Window_TitleBar  )
  If CreateGadgetList(WindowID(0))
    SpinGadget(#Spin_0,360,550,50,25,0,300,#PB_Spin_ReadOnly|#PB_Spin_Numeric)
    SetGadgetState(#Spin_0,180)
  EndIf
 
  Diagramm()


  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case #Spin_0
          Diagramm()
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow 
EndIf
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Beitrag von dibro »

Danke für die Mitarbeit.
Wenn es durch Vertauschen der Faktoren geht und umgekehrt nicht, weist das doch auf einen Kompilerfehler hin. Das komische bei der Sache war, dass die Ergebnisse nicht auf allen Rechnern identisch sind und bei mir lief es, aber bei den Kollegen z.T. nicht.

@edel
Das war nur ein schnelles Kodeschnippselchen, natürlich nicht optimiert. Das habe ich erstellt, um meinem rätselhaften Fehler auf die Spur zu kommen. Mit der Eventypabfrage hab ich mir geschenkt, das weiß ich jetzt, das habe ich hier an anderer Stelle schon mal erfragt, weil es rätselhaft war, dass eine Procedur mit langer Laufzeit 2 x aufgerufen wurde.

Nachtrag @#Null
..nee, ich meinte ursprünglich horizontale Zacken, da habe ich meine Diagramme mit einem Spin gestretched und mit einem Trackbargadget horizontal verschiebbar gemacht. Das komische war dabei nur, dass der durch die Spinabfrage auftretende Fehler auch kam, wenn ich den Spin gar nicht drehte. Wahrscheinlich weil der Inhalt trotzdem jedesmal abgefragt wurde. Da wo er jetzt steht, steht er besser :D
Gruß aus Solingen, PB 6.0 Win 10 Pro
Antworten