Seite 1 von 3

Berechnung Sinus-Bewegung / Bogenmaß

Verfasst: 11.10.2006 11:25
von Agent
Moin.

Ich habe ein kleines Mathe-Problem:
Ich möchte etwas von a nach b bewegen, beispielsweise ein Fenster oder Sprite oder ähnliches. Ein wenig hab ich schon mit Sin() experimentiert, aber das Problem ist die Berechnung des Bogenmaßes...

Beispiel:
Ein Fenster ist an Pos 100,100. Ich möchte es nach 0,100 (also nach links) bewegen. Nun nicht einfach per x=x-1 sondern eben so, dass das Fenster sich erst schneller und kurz vor ende immer langsamer an sein Ziel bewegt. Wenn ich das richtig sehe, ist hierbei das Bogenmaß entscheidend für die zu bewegenden Pixel (im Beispiel 100 Pixel zu bewegen).

Kann mir da jemand, der mehr Ahnung von Sin(), Cos() und Co hat mal ein Beispiel posten? Gefunden habe ich leider nichts, womit ich das realisieren kann.

Schön wäre, wenn das Beispiel dabei auch eine Bewegungsgeschwindigkeit berücksichtigt.


Vorab vielen Dank für eure Mühe.

Ich hoffe irgendwer hat sowas in seinen Code-Snippets liegen und braucht es nur zu posten ;)

Verfasst: 11.10.2006 11:33
von Kaeru Gaman
1)
Bogenmaß ist nur eine andere maßeinheit.

umrechnen von Grad in Bogenmaß:

Code: Alles auswählen

Rad = Grad / 180 * #Pi
in grad beträgt der Umfang eines Kreises 360°,im Bogenmaß sind es 2Pi.
das entspricht dem tatsächlichen umfang eines Kreises mit dem Radius 1.

2)
für eine einfache beschleunigte bewegung, wenn sie gradlinig erfolgt,
würde ich nicht versuchen, etwas mit sinus oder cosinus zu deichseln,
das gehört in bogenförmige bewegungen.

beschleunigte bewegungen sind quadratische funktionen,
sowas kann man gut mit einer 2ten variable simulieren.

etwas schwierig wird es, wenn der zielpunkt festliegt, und man ihn exakt erreichen muss,
aber vielleicht war das ja auch nur ein beispiel, das du dir so rausgepickt hast.

ich kann dir nachher mal ein kleines beispiel proggen, aber jetzt muss ich erstmal kochen.

Verfasst: 11.10.2006 12:39
von Agent
Hi Kaeru.

Irgendwie wusste ich schon das von Dir ein Post dabei ist ;)

Hm..lecker, was gibts denn?
*in-die-reihe-stell*

Vielleicht sollte ich es doch "einfach" lösen. Ich wollte es irgendwie "elegant" lösen mit Sin(). Nicht nur, das es einfach funktioniert ;)

Aber wäre trotzdem schön, Du hättest ein Snippet ;)

Verfasst: 11.10.2006 12:42
von Kaeru Gaman
> Irgendwie wusste ich schon das von Dir ein Post dabei ist
öh.. :oops: ..nuja, sowas ist halt mein "fachgebiet"

> was gibts denn?
Kohl-Nudel-Pfanne

> Ich wollte es irgendwie "elegant" lösen mit Sin()
wir werden später was elegantes ausfutzeln, keine angst. ;)

Verfasst: 11.10.2006 13:07
von #NULL
:lol: ..na da laß ich euch beide mal allein 8)

Verfasst: 11.10.2006 13:09
von Agent
Klingt lecker. *ins-forum-ruf: Mädels, essen ist fertig*

Man(n) könnte auch die Billigversion nehmen indem man die Pixeldifferenz nimmt und immer halbiert bis zu 0 (NULL). Das wäre dann aber sehr unflexibel ;)

Verfasst: 11.10.2006 13:21
von #NULL
#NULL hat geschrieben::lol: ..na da laß ich euch beide mal allein 8)
..öhm.. nö

vielleicht reicht das ja schon

Code: Alles auswählen

w=400
h=400
hWin=OpenWindow(0, 500,100,w,h, "")
CreateGadgetList(hWin)
  ButtonGadget(0,20,20,50,20,"lala")
posX.f
Repeat
  event=WindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit=1
    Case #PB_Event_Gadget
      posX.f=WindowX(0)
      posY=WindowY(0)
      While posX>1
        posX*98/100.0
        ResizeWindow(0,posX,posY,w,h)
        Delay(2)
      Wend
  EndSelect
Until quit

Verfasst: 11.10.2006 13:24
von Kaeru Gaman
soll es denn unbedingt ein fenster sein, oder kann man die bewegung
auch mit DirectDraw oder sogar auf nem Screen demonstrieren?

Verfasst: 11.10.2006 13:36
von #NULL
hab noch ein Delay(2) eingefügt ..smooth

Verfasst: 11.10.2006 21:53
von Agent
Hi Ihr 2.

Hoffe die Kohlpfanne war gut ;)

Neee #null, das ist nicht das was ich suche, da könnt ich ja gleich x=x-2 schreiben oder wie in meinem beispiel move_x / 2 (wäre ähnlich) ;)

das Fenster in dem Beispiel soll sich erst schnell und gegen Ende langsamer bewegen.