Autor Beitrag
Rool
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: Do 27.02.03 19:47 
Ich habe eine Scheibe, die der User per Maus dreht! Das klappt soweit alles bestens, die aktuelle Gradzahl wird an einer scrollbar veranschaulicht, dessen Button sich (wenn der User mit regelmässiger Bewegung dreht) mit regelmäßiger Geschwindigkeit von links (0) bis rechts (360) bewegt. Dann fängt er wieder links an!
Jetzt will ich die aktuelle Drehbewegungsgeschwindigkeit messen. Das heisst, wenn sich der Scrollbarwert schneller und mit größeren Schritten ändert, ist die Geschwindigkeit schneller.
Das ganze soll jetzt aber weich verlaufen. Ich hab im Moment n Timer, der immer den Unterschied des letzten Wertes mit dem aktuellen vergleicht. Sobald der User die Scheibe langsam dreht ist der Aktuelle minus den alten Wert manchmal null, deswegen ist der Speed dann plätzlich null. -> Der speed "flackert" die ganze zeit.

Wie kann ich das beheben?
(über Code-Bsp. würde ich mich auch sehr freuen...)

_________________
MFG Rool
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 27.02.03 20:01 
Hi!

Wie wäre es hiermit?

ausblenden 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:
26:
27:
28:
29:
30:
var
  Form1: TForm1;
  alter_winkel : Integer;
  alte_zeit : Integer;
  first_change : Boolean;

implementation

{$R *.dfm}

procedure TForm1.ScrollBar1Change(Sender: TObject);
VAR omega : Real;
    aktuelle_zeit : Integer;
begin
  if not first_change then
  begin
    aktuelle_zeit:=GetTickCount;
    if aktuelle_zeit = alte_zeit then aktuelle_zeit:=alte_zeit+1;
    omega:=(Scrollbar1.Position-alter_winkel)/(aktuelle_zeit-alte_zeit)*1000;
    edit1.text:=FloatToStr(omega);
  end;
  if first_change then first_change:=False;
  alter_winkel:=ScrollBar1.Position;
  alte_zeit:=GetTickCount;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  first_change:=true;
end;


MfG,
Peter

P.S.: Omega ist in Grad/s angegeben.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".