Autor Beitrag
SvenLittkowski
Hält's aus hier
Beiträge: 11

Win XP
D7
BeitragVerfasst: Mi 16.03.05 18:04 
Hi. Mit welcher mathematischen Formel kann ich eine Komponente bei MouseMove-Event kreisförmig verschieben? Die Komponente soll sich um einen gedachten kreis solange in eine Richtung bewegen, solange die Maus nach rechts bewegt wird oder ein definierter Endpunkt der Bewegung am Kreisrand erreicht wird. Und die Komponente soll sich solage um den gedachten Kreis zurück bewegen, solange sie mit der Maus nach links gezogen wird und ihren definierten Startpunkt am Kreisrand noch nicht erreicht hat.

Für jegliche Hilfe bin ich sehr dankbar.

Sven Littkowski
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 16.03.05 18:10 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
with AnyControl do
begin
 left := x0+Round(r*cos(w*pi/180));
 top := y0+Round(r*sin(w*pi/180));
end;
w = aktuelle Position (Winkel in Grad)
x0,y0 = Mittelpunkt des Kreises
r = Radius des Kreises

In deinem Fall kannst du w (bis auf einen Faktor und einer Verschiebung) mit der X-Position der Maus gleichsetzen.
SvenLittkowski Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
D7
BeitragVerfasst: Do 17.03.05 03:21 
Titel: Vielen Dank!
Vielen Dank für die Hilfe, ich werde es gleich ausprobieren.

Sven Littkowski
SvenLittkowski Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
D7
BeitragVerfasst: Do 17.03.05 20:55 
Titel: An Delfiphan
Hallo "Delfiphan",

ich habe Deine Code nun ausprobiert und bin recht begeistert. Es klappt soweit ganz gut. Ein Problem war jedoch das viel zu schnelle Drehen der Componente bei der Mausbewegung.

Wenn man nun einen ScrollBar zum Bewegen benutzt, kann man die Komponente recht gut drehen. Aber es soll ja die Komponente selbst sein, die man "schiebt".

Kennst Du en DVD-Player "Power-DVD"? Dort kann man die Abspielgeschwindigkeit der DVDs mit so einer kreisförmig zu bewegenden Komponente regeln. Genau so eine Bewegungsfunktion will ich.

Ich habe also meine Meinung etwas abgeändert, nachdem ich mit der Kreisformel so begeistert bin. Wie aber kann ich nun nicht nur waagerechte Mausbewegung, sondern auch senkrechte einbeziehen?

Kannst Du mir da noch einmal helfen, wenn es Dir nichts ausmacht?

Vielen Dank,

Sven Littkowski
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 18.03.05 00:18 
Kenne den Player leider nicht. Vielleicht ist es das folgende, was du suchst.

Erstell ein TImage mit dem Namen Image1 der Grösse 200x200 auf dem Form. Verbinde dann die Funktionen Image1MouseDown, Image1MouseMove und Image1MouseUp (siehe unten) mit den entsprechenden Events des Images.

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
const
 x0 = 100;
 y0 = 100;
 R1 = 80;
 R2 = 100;

Var
 PosX, PosY, PX, PY : Integer;
 x1,y1 : Extended;
 Pressed : Boolean;

function ShiftNorm(InX, InY : Integer; Var OutX, OutY : Extended) : Boolean;
Var
 L : Extended;
begin
 dec(InX, x0);
 dec(InY, y0);
 L := sqrt(sqr(InX)+sqr(InY));
 OutX := InX/L;
 OutY := InY/L;
 Result := L < R2;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if ShiftNorm(X,Y,x1,y1) then
 begin
  PosX := PX-x0;
  PosY := PY-y0;
  Pressed := True;
 end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var
 x2, y2, nX, nY, L : Extended;
begin
 if Pressed and ShiftNorm(X,Y,x2,y2) then
 begin
  nX := (x1*x2+y1*y2)*PosX+(y1*x2-x1*y2)*PosY;
  nY := (x1*y2-y1*x2)*PosX+(x1*x2+y1*y2)*PosY;
  L := sqrt(sqr(nX)+sqr(nY));
  nX := nX/L*R1+x0;
  nY := nY/L*R1+y0;
  PX := Round(nX);
  PY := Round(nY);
  With Image1.Canvas do
  begin
   Ellipse(x0-R2,y0-R2,x0+R2,y0+R2);
   Ellipse(PX-5,PY-5,PX+5,PY+5);
   Rectangle(x0-2,y0-2,x0+2,y0+2);
  end;
 end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Pressed := False;
end;
SvenLittkowski Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
D7
BeitragVerfasst: Fr 18.03.05 16:15 
Titel: Vielen Dank
Du hast mir sehr weitergeholfen.

Mit freundlichen Grüßen,

Sven Littkowski