Ein Logo bewegen (mathematisch)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Ein Logo bewegen (mathematisch)

Beitrag 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
Benutzeravatar
bernd
Beiträge: 165
Registriert: 06.09.2004 08:02
Wohnort: Paderborn (PB)

Beitrag 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
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Ich dachte PB ist nicht casesensitiv? :o
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von memdee »

Ist es auch nicht ---> Schwachfug.
meep?
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
bernd
Beiträge: 165
Registriert: 06.09.2004 08:02
Wohnort: Paderborn (PB)

Beitrag von bernd »

Ist es auch nicht ---> Schwachfug.
Stimmt, sorry :oops:

bis bald bernd
Benutzeravatar
SäsH
Beiträge: 8
Registriert: 01.09.2004 02:53
Wohnort: Nähe Stuggi

Beitrag 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)
Der Mensch kann zwar tun was er will, aber nicht wollen was er will.
Dieser Umstand bewahrt mich davor die Handlungen meiner Mitmenschen allzuernst zu nehmen, und den guten Humor zu verlieren.
Benutzeravatar
bernd
Beiträge: 165
Registriert: 06.09.2004 08:02
Wohnort: Paderborn (PB)

Beitrag 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
Antworten