Autor Beitrag
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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:
ausblenden 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;                     //hier muss boxh mit berechnet werden aber wie? 
            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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 20.07.10 02:06 
ja Leute ich packs nicht!:bawling:
Egal wo ich versuche was einzusetzen es will nicht richtig passen!
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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 :wink:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 20.07.10 13:26 
So, ich wage mich auch mal dran.... (mit der Erklärung kann ich die Formel wenigstens verstehen ...)

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:

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?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if x > 0 then
        begin
            peakbufl.Canvas.Pen.Color:= clblack;                     //hier muss boxh mit berechnet werden aber wie? 
            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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 20.07.10 13:36 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
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!
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 20.07.10 15:45 
Ne das Zeichnen passiert doch schon in
ausblenden 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);        //TimerPaintBox
   leftpbh.Canvas.Draw(0,0,lbuf);           //LevelLeftPaintBox
   rightpbh.Canvas.Draw(0,0,rbuf);          //LevelRightPaintBox
   leftcannelpb.Canvas.Draw(0,0,peakbufl);  //LeftChannelPaintBox incl WaveCurve
   rightcannelpb.Canvas.Draw(0,0,peakbufr); //RightChannelPaintBox inl WaveCurve
end;

// und hier werden die Bitmaps aufgerufen------------------------------------------
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 20.07.10 17:10 
Hmmm ... irgendwie verstehe ich dein Problem immer noch nicht ganz.

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
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.)

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
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)

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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 :wink:
Mal ein anderes Beispiel, was ich ohne hilfe vielleicht in Tagen geschafft hätte!
so wird die hintergrund farbe gesetzt!!
ausblenden 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
//Linkerkanal
   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);
//rechterkanal
  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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 20.07.10 18:17 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 22.07.10 00:41 
ok, Problem gelöst!
Warum allerdings der Original Wert 512 auf 768 gesetzt werden muss :nixweiss:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 22.07.10 15:16 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
ok, Problem gelöst!
Warum allerdings der Original Wert 512 auf 768 gesetzt werden muss :nixweiss:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 22.07.10 18:37 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
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 :rofl: .
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!