| Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 18.07.10 22:29
Jo, ich mit den üblichen Matheprobleme.
Ich zeichne über einer Paintbox mit hilfe einer Bitmap eine Wavecurve. Funct auch alles.
Problem, wenn die Paintbox kleiner gemacht wird(die Form wird kleiner gemacht), bleibt die Wavecurve trotzdem noch so gross, wie sie eingelesen wurde!
Wo muss ich also die höhe der Paintbox mit berechnen das die Wavecurve sich mit anpasst?
Mein jetziger Code dafür:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm3.DrawPeaks; var ht, x, boxh: integer; begin ht:= trunc((leftcannelpb.Height / 2 )+ 0.5); boxh:= leftcannelpb.Height; peakbufl.Canvas.MoveTo(0, ht); for x:= 0 to peakbufl.Width do begin ...... if x > 0 then begin peakbufl.Canvas.Pen.Color:= clblack; peakbufl.Canvas.LineTo(x - 1, ht - trunc((power(2, yzoom) * (wavebufL[x - 1]) / 512))); end; .... .... |
ich hab schon ewig gebraucht um das: ht - trunc((power(2, yzoom) * (wavebufL[x - 1]) / 512)); hinzubekommen
nun bin ich langsam am verzweifeln, wegen diesem Problem. Ich finde nicht die richtige Lösung!!!
Egal wo ich versuche ht mit / und * einzusetzen es kommt nur müll raus!!
EDIT: Nicht ht, ht ist ja die Mittellinie. Ich muss also boxh nehmen. Ändert aber nix an mein Problem.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 02:06
ja Leute ich packs nicht!
Egal wo ich versuche was einzusetzen es will nicht richtig passen!
Delphi-Quelltext 1:
| peakbufl.Canvas.LineTo(x -1, ht -trunc(power(2, yzoom)*(boxh/100* wavebufL[x-1])/512)); | so will es nur teilweise funktionieren. Nur ist die Wavecurve leider durch das Ergebins von, boxh/100 * ,dummerweise auch grösser!!!
Der Versuch mit, -boxh/100 ,das wieder abzuziehen bringt nicht den richtigen Erfolg!
Grund: Ich weiss nicht wiiiie, ich das korrekt einsetzen muss, mit Klammer, Vorzeichen, davor, dahinter oder sogar in der ganzen Berechnung?????
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 20.07.10 02:36
darf man fragen wie du auf die einzelnen werte für die jeweiligen formeln in deiner Procedure gekommen bist? Ohne dem fällt es mir persönlich ziemlich schwer, obwohl ich dir gerne helfen würde weil mich das doch ziemlich interessiert.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 02:58
ich versuchs mal
ht = Die mitte der Paintbox = Mittellinie für die Wavcurve
power(2, yzoom) = Power errechnet aus Base und einen beliebigen Wert die Potenz
yzoom = Vergrösserungfaktor von 0-8
wavebufL[x-1] = dort befinden sich die Peakdaten der Sounddatei drin
/512 musste ich machen, ist das maxergebnis von power!
Boxh = höhe der Paintbox,
Wie ich es geschaft habe, das soooo hinzubekommen, hat mindesten 2 tage gedauert bis es entlich funktionierte.
Nun kommt aber ebend noch das ander Problem hinzu, wie ich oben schon erörtert habe!
Da häng ich auch schon 3 Tage dran das richtig einzusetzen!
Von diesen dingern muss ich mindestens noch 4-5 machen, das die grapfichen sachen richtig funktionieren, bevor ich am eigentlichen Projekt weitermachen kann!
und die werden noch komplizierter.
Und das mit meinen Fäh...... naja sprechen wir nicht davon!
Ich hoffe die Angaben nützen was!?
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 20.07.10 13:09
danke, ich werds mir mal genauer ansehen. btw, du weißt, dass die "Kurve" derzeit beim Zoomen gestaucht wird und nur dir y-Achse gezoomt wird? Wenn du einen Proportionalen Zoom haben willst, musst du auch die x-Achse zoomen.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 13:25
hi,
Die xachse kommt ja noch!! Da wird es auch sehr kompliziert, weil ich hier nicht wie das Demo von Bass.Dll (CustLoop) arbeite, sondern dies nur als Vorlage für mich diente!
Aber ich gehe lieber der Reihe nach, als nun den Versuch zu starten alles auf einmal zu lösen!
Also erst mal die yAchse, später die xAchse, dann noch die TimeLine(Zeitanzeige)muss so ähnlich funktionieren wie die xAchse und noch die PeakLine ist auch von der yAchse abhängig. Also Matheaufgaben ohne Ende.
Ich glaube ich brauch ein Professor dafür
Nein, im Prinzip ist mir ja das alles klar. Nur scheitert es ebend an der richtigen Zusammensetzung der Formeln!!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 20.07.10 13:26
So, ich wage mich auch mal dran.... (mit der Erklärung kann ich die Formel wenigstens verstehen ...)
ALF hat folgendes geschrieben : |
Wie ich es geschaft habe, das soooo hinzubekommen, hat mindesten 2 tage gedauert bis es entlich funktionierte.
Da häng ich auch schon 3 Tage dran das richtig einzusetzen! |
Interessant. Hast du mal versucht, die das auf nem Blatt Papier zu verdeutlichen was du da hingeschrieben hast?
Delphi-Quelltext 1: 2: 3: 4: 5:
| if x > 0 then begin peakbufl.Canvas.Pen.Color:= clblack; peakbufl.Canvas.LineTo(x - 1, ht - trunc( (power(2, yzoom) / 512) * (leftcannelpb.Height / <HÖHE>) * wavebufL[x - 1] )); end; |
für <HÖHE> bitte die ursprüngliche Höhe der PB eintragen. Dann sollte sich das Ganze der Höhe anpassen.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 13:36
jfheins hat folgendes geschrieben : | | Interessant. Hast du mal versucht, die das auf nem Blatt Papier zu verdeutlichen was du da hingeschrieben hast? |
Mehr als das, Seitenweise, ohne denn glaube ich brauch man gar nicht erst Anfangen, wenn es so "komplex" wird!
Delphi-Quelltext 1:
| (leftcannelpb.Height / <HÖHE>) |
leftcannelpb.height ist die aktuelle höhe der Paintbox. Also selbst wenn die Form auf der die PaintMap liegt, ich grösser mache oder kleiner mache passt sich ja die höhe der Paintbox mit an!!
Also wo soll ich jetzt den wert <HÖHE> hernehmen!??
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 20.07.10 13:55
den könntest du beim rezize vom Formular speichern. Hier steht wie man die Messages abfangen kann die einem anzeigen wann der Resize angefangen hat und wann er aufgehört hat. Dadurch kannst du beim Anfang den Wert speichern und am Ende dann alles Zeichnen.
//Edit: Wenn ich nochmal drüber nachdenke, könntest du sogar schon im OnResize dann zeichnen, bin mir aber nicht sicher.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 15:45
Ne das Zeichnen passiert doch schon in
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm3.FormPaint(Sender: TObject); begin timerpb.Canvas.Draw(0,0,Timebuf); leftpbh.Canvas.Draw(0,0,lbuf); rightpbh.Canvas.Draw(0,0,rbuf); leftcannelpb.Canvas.Draw(0,0,peakbufl); rightcannelpb.Canvas.Draw(0,0,peakbufr); end;
procedure TForm3.Timer1Timer(Sender: TObject); begin DrawTimeline; DrawLevelLine; DrawSpectrum; DrawPeaks; formpaint(sender); Edit_Audio.StatusBar1.Panels.Items[3].Text:= '> '+ timepos(round(BASS_ChannelBytes2Seconds(mychan, BASS_ChannelGetPosition(mychan, BASS_POS_BYTE) * 1000))); if BASS_ChannelIsActive(mychan)<> 1 then begin Edit_Audio.stopbutton.Enabled:= false; Edit_Audio.playbutton.Enabled:= true; end; end; |
sonst würde ja das andere auch nicht funktionieren.
Wie gesagt, die oben angegebene Formel mit boxh/100 * funct ja, die WaveCurve wird ja auch Proportional kleiner/grösser je nach grösse der Paintbox, Problem!! Das Ergebnis von boxh/100 muss irgend wo noch mal, im Verhältnis zur WaveCurve abgezogen werden!
Wie Du schon erwähnt hast, im Prinzip Strecken und Stauchen, aber nicht die egentlichen Werte der Wavecurve "verändern".
Ich hänge mal zwei Bilder mit ran um es optisch darzu stellen!
Gruss Alf
Einloggen, um Attachments anzusehen!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 20.07.10 17:10
Hmmm ... irgendwie verstehe ich dein Problem immer noch nicht ganz.
ALF hat folgendes geschrieben : | | Wie gesagt, die oben angegebene Formel mit boxh/100 * funct ja, die WaveCurve wird ja auch Proportional kleiner/grösser je nach grösse der Paintbox, |
Okay, ich hätte gedacht dass das boxh/100 das Problem löst. (Im Grund ist es nur wichtig, dass durch eine Konstante geteilt wird, und nicht durch etwas variables.)
ALF hat folgendes geschrieben : | | Problem!! Das Ergebnis von boxh/100 muss irgend wo noch mal, im Verhältnis zur WaveCurve abgezogen werden! |
Ähhh ... warum? Was ist denn falsch? (von der Darstellung her)
ALF hat folgendes geschrieben : | Wie Du schon erwähnt hast, im Prinzip Strecken und Stauchen, aber nicht die egentlichen Werte der Wavecurve "verändern".
Ich hänge mal zwei Bilder mit ran um es optisch darzu stellen! |
Ich nehme mal an, die Bilder zeigen den IST-Zustand ... wenn ich das richtig erkenne, ist der Graph immer "gleich groß" und wird eben an den Rändern oben und unten abgeschnitten. Diese Ränder variieren.
Und der SOLL-Zustand besteht dann darin, dass sich der Graph mit der Höhe skaliert, sodass immer gleich viel abgeschnitten wird?
P.S.: Power(2, x)/512 <=(entspricht genau)=> Power(2, x-9)
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 17:21
Hier mal 2 bilder von der OriginalSoftware. Ich weiss es blöd zu erklären wenn man es nicht sieht!
ES ist im Prinzip nur ein Propotionales anpassen an die PaintBox! aber ebend wie!?
Gruss ALf
Einloggen, um Attachments anzusehen!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 20.07.10 17:40
Ah okay, dann hatte ich es doch richtig verstanden. Und die Lösung ist dann genau das boxh/100
Es kann natürlich sein, dass du danach wieder etwas mit dem yzoom-Faktor spielen musst, bis das wieder gut aussieht.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 20.07.10 18:01
Davon rede ich doch schon die ganze Zeit! das das Ergebnis box/100, wieder irgendwo noch in einem Verhältnis zum ganzen oder zu irgend ein Teil davon wieder gebracht werden muss!
mit dem yzoom faktor als solches hat es eigentlich weniger zu tuen, muss natürlich mit berücksichtigt werden. Denn wenn yzoom 0 ist und die originalkurve da ist, muss auch sie Proportional zur Paintbox bleiben!! Es ist ja nur ne richtige zusammenstellung der Parameter an den richtigen stellen
Mal ein anderes Beispiel, was ich ohne hilfe vielleicht in Tagen geschafft hätte!
so wird die hintergrund farbe gesetzt!!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| for ypos:= 0 to peakbufr.Width do begin peakbufl.Canvas.Pen.Color:= RGB( Trunc(102+ (255 - 102) / peakbufl.Height *ypos) , Trunc(113+ (255 - 113) / peakbufl.Height *ypos) , Trunc(126+ (255 - 126) / peakbufl.Height *ypos) ); peakbufl.Canvas.MoveTo(0, ypos); peakbufl.Canvas.LineTo(peakbufl.Width, ypos); peakbufr.Canvas.Pen.Color:= RGB( Trunc(102+ (255 - 102) / peakbufr.Height *ypos) , Trunc(113+ (255 - 113) / peakbufr.Height *ypos) , Trunc(126+ (255 - 126) / peakbufr.Height *ypos) ); peakbufr.Canvas.MoveTo(0, peakbufr.Height - ypos); peakbufr.Canvas.LineTo(peakbufr.Width, peakbufr.Height - ypos); end; |
Wie gesagt, wie es sein soll ist das eine, die richtige umsetztung in die passende Formel ist das Problem!!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 20.07.10 18:17
ALF hat folgendes geschrieben : | Davon rede ich doch schon die ganze Zeit! das das Ergebnis box/100, wieder irgendwo noch in einem Verhältnis zum ganzen oder zu irgend ein Teil davon wieder gebracht werden muss!
Wie gesagt, wie es sein soll ist das eine, die richtige umsetztung in die passende Formel ist das Problem!!
Gruss Alf |
Dieses boxh/100 IST bereits die richtige Umsetzung.
Wenn sich die Höhe verdoppelt, verdoppelt sich auch dein Graph. Wenn sich die Höhe halbiert, halbiert sich auch dein Graph. Die einzige Sache ist eben noch, dass ein zusätzlicher Skalierungsfaktor drin ist. (das 1/100) und wenn du das boxh/100 reintust und direkt vergleichst, wirst du einen kleinen Unterschied feststellen können, also der Graph ist größer skaliert als vorher.
Das liegt daran, dass die Paintbox nicht 100px hoch ist.
Wenn du aber die Paintbox vergrößerst/verkleinerst sollte der Graph mitskaliert werden, und zwar genau so dass der sichtbare Bereich der gleiche bleibt.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 22.07.10 00:41
ok, Problem gelöst!
Warum allerdings der Original Wert 512 auf 768 gesetzt werden muss
Delphi-Quelltext 1:
| ht - trunc((boxh/100 * wavebufL[x-1])*(power(2, yzoom)/768)) |
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Do 22.07.10 15:16
ALF hat folgendes geschrieben : | ok, Problem gelöst!
Warum allerdings der Original Wert 512 auf 768 gesetzt werden muss
Delphi-Quelltext 1:
| ht - trunc((boxh/100 * wavebufL[x-1])*(power(2, yzoom)/768)) |
Gruss ALf |
Wahrscheinlich weil deine Box orginal eine Höhe von 150 Pixeln hat.
Vom Prinzip her machst du ja nicht anderes, als die Werte mit mehreren Skalierungsfaktor zu multiplizieren. Der eine ist boxh/100 und der andere ist 2^yzoom/768 genauso könntest du schreiben
boxh*2^yzoom/76800
Es ist nur wichtig dass die Zahl da hinten eine Konstante ist. Alles andere kannst du auch durch Variation des yzoom hinbekommen. Wenn du jetzt sagst "Also bei yzoom=9 und Höhe=150 soll das ganze bitte 1:1 skalierst werden" dann musst du eben 76800 da hin schreiben. Aber wie gesagt, welche Zahl da steht ist im Grunde irrelevant, du kannst mit dem yzoom-Faktor immernoch alle Zoomfaktoren abdecken!
Diese 76800 kannst du auch aufteilen. Also einmal durch 768 teilen und einmal durch 100. oder einmal durch 150 und einmal durch 512. Das ist Jacke wie Hose
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 22.07.10 18:37
jfheins hat folgendes geschrieben : | | Wahrscheinlich weil deine Box orginal eine Höhe von 150 Pixeln hat. |
Nein, die Box kann eine Höhe von 1 bis xhoch sein, das hatte damit nichts zu tun!
Fehler war, nicht erkennen von mathematischen Zusammenhänge!
Habe Tage dazu gebraucht, aber nun ist alles schick.
Dank an euch, die versucht haben mir zu helfen.
Auf zur nächsten Logik, die noch verrückter wird  .
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
|