Seite 1 von 1

Ein Logo bewegen (mathematisch)

Verfasst: 13.09.2004 12:52
von Dristar
Hallo !!

Habe ein Problem mit der Umsetzung.Ich möchte ein imageBild(Logo)
in Bewegung setzen.Das Logo soll eine umgelegte 8 abfahren.

mein code

Code: Alles auswählen

Procedure logo(bild)
Global x
Global s
Global y
StartDrawing(WindowOutput())
DrawImage(bild, x, y,400,70) 
StopDrawing()
If s=0
  If x<150
         y=Sin(1*x)
      x=x+1
   Else
    s=1
  EndIf 
Else
  If x>-150 
       y=Sin(1*X)
    x=x-1
   Else
    s=0
  EndIf
EndIf
;Delay(1)
EndProcedure
UseJPEGImageDecoder()

OpenWindow(0,0,0,400,300,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Bild")
CreateGadgetList(WindowID())
bild.l=LoadImage(#PB_Any,"c:\test5.jpg")
bild = UseImage(bild)
           NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW
           NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor)) 
 x=0:s=0:y=0
 f=0.1
 intervall = 1/f
Repeat
logo(bild)
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
Until quit 

Es hat mir jemand zu dem Problem geschrieben in einem anderen Board.
Ich kann es nur nicht umsetzen :freak: :cry:

Mail:

als y-wert nimmst du den SINUS, das gibt bereits mal eine schöne auf- und abbewegung innerhalb der grenzen ±1.

als x-wert nimmst du die zeit, die aber nach dem intervall 2¶ rückwärts laufen muss bis zum ursprung.

z.b. soll dein logo in 10 sekunden eine schleife drehen:

f = 0.1 hz -> intervall = 1/f = 10 s

nach 1 s (x = 1) ist y = sin (w*t) = sin (2*¶*f*t) = sin (2 * ¶ * 0,1 * 1) = 0.588

nach 2 s (x = 2) ist y = sin (w*t) = sin (2*¶*f*t) = sin (2 * ¶ * 0,1 * 2) = 0.951

nach 2,5 s (x = 2,5) ist y = sin (w*t) = sin (2*¶*f*t) = sin (2 * ¶ * 0,1 * 2,5) = 1 (maximum!)

danach nimmt y ab, und nach 5s sind wir wieder beim nullpunkt. dann wird y negativ, und nach 10s sind wir wieder beim nullpunkt. anschliessend musst du die zeit (= x-achse) rückwärts zählen bis auf null, die y-werte können beibehalten werden usw.

um den schnittpunkt zu ändern, musst du einfach einen offset zur zeitachse addieren bzw. subtrahieren. es gibt noch viele andere möglichkeiten.


mfg Dristar

Verfasst: 13.09.2004 13:03
von bernd
y=Sin(1*X)
Hier ist schon mal ein Fehler, X muß ein kleines x sein!
Vom Ansatz ist das mit den phasenverschobenen Sinuskurven schon mal gut.

bis bald bernd

Verfasst: 13.09.2004 13:23
von DrShrek
Ich dachte PB ist nicht casesensitiv? :o

Verfasst: 13.09.2004 13:26
von memdee
Ist es auch nicht ---> Schwachfug.

Verfasst: 13.09.2004 13:33
von freedimension
Nicht perfekt, aber besser:

Code: Alles auswählen

Procedure logo(bild)
  Global x, s
  
  d.f = 150.0 / 3.14159265
  
  x + s
  y = Sin((s*x) / d) * 100.0
  
  If (x > 150) Or (x < -150)
    s = -s
  EndIf
  
  StartDrawing(WindowOutput())
  Box(0,0,400,300, $FFFFFF)
  DrawImage(bild, x+200, y+100)
  StopDrawing()
EndProcedure
UseJPEGImageDecoder()

OpenWindow(0,0,0,400,300,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Bild") 
CreateGadgetList(WindowID()) 
;bild.l=LoadImage(#PB_Any,"c:\test5.jpg")
bild.l = CreateImage(#PB_Any, 10, 10)
bild = UseImage(bild)
NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW
NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor))
x=0:s=1:y=0
f=0.1
intervall = 1.0/f
Repeat
  Delay(10)
  logo(bild)
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
Until quit

Verfasst: 13.09.2004 13:49
von bernd
Ist es auch nicht ---> Schwachfug.
Stimmt, sorry :oops:

bis bald bernd

Verfasst: 13.09.2004 14:36
von SäsH
also die acht, erhält man so:

"a" von "0" nach "6.28" laufen lassen.

x=sin(a)*radius
y=cos(a*2)*radius

dann einfach das image/sprite etc. auf die x,y koordinaten setzen.
(falls die acht steht, x und y vertauschen)

Verfasst: 14.09.2004 15:22
von bernd
Habe mich nochmals mit dem Problem beschäftigt.

Als Bahngleichung benutze ich eine Lemniskate, wird u.a. im
Strassen- und Schienenbau angewandt. Diese Kurve beschreibt in den
Grenzen 0 bis 2 PI exakt eine liegende 8 (Zeichen für Unendlichkeit).

Als Grundlage habe ich das Sprite-Beispiel aus Pure Basic genommen.

Code: Alles auswählen

; ------------------------------------------------------------
;
;   Lemniskate
;
;   
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf
 
 intervall.f= 3.14/50 ;pi verteilt
 t.f=0
;
;

If OpenScreen(640, 480, 16, "Sprite")

 
  ; 
  LoadSprite(0, "Data\PureBasic.bmp", 0)
  CopySprite(0,1,0)
  
  
  Repeat
    
   
    
    FlipBuffers()
    
     ClearScreen(0,0,0)
    
    
      
    t.f = t.f + intervall.f
    
    y.f = 300 * Sin(t) * Cos(t) / (1 + Pow (Sin(t),2))+200 ; Lemniskate in Kartesischen Koordinaten
    x.f = 300 * Cos(t) / (1 + Pow (Sin(t),2))+300           
    
    DisplaySprite(0, x, y) ; koordinatenursprung in Bildmitte
    
    If t > 6.28             ;Richtungswechsel 
      
      t=0 
     
     EndIf
         
     If t < 0 
      intervall = 3.14/50
    EndIf
        
    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)
  
Else
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf


bis bald bernd