Suche Formel zur berechnung eines Punktes

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Suche Formel zur berechnung eines Punktes

Beitrag von benpicco »

Ich suche nach einer formel, die berechnet, was ich zu X/y addieren muss, damit die Kugel bei Folgendem code an der spitze des Pfeils (zum testen irgeneinen Pfeil und eine kugel malen, geht schnell ^^) abgeschossen wird. Also, angenomme der Kreis (den man sich denken kann) um den Pfeil hat einen Durchmesser von 40pxl, weil der Pfeil so lang ist, muss man, wen der Pfeil -> zeigt (=0°) xs=x+40 und ys=ys+20 rechnen. Bei <- (90°) xs=x+0 ys=y+0,
bei ^ xs=x+20 und ys=y+0 und bei v xs=x+20 ys=y+40, aber was ist dann bei z.b 65°, oder bei 100° (außer, das dan wasser kocht ;))
Achso, hier der Code:

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1024,768,16,"Test")
LoadSprite(1,"pfeil.bmp", #PB_Sprite_Texture)
LoadSprite(2,"kugel.bmp")
TransparentSpriteColor(1,255,0,255)
TransparentSpriteColor(2,255,0,255)
CreateSprite3D(1,1)
Sprite3DQuality(1)
Global x.w
Global y.w
Global trans.w
Global speed.w
Global plus.b
Global t.f
Global xs.w
Global ys.w
Global schies.b
Global g.f
g=-1   ;sonst fällt alles nach oben ^^
plus=1
speed=1
;---Anfang Code Template
; Drehen 
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left) : winkel - 1 :  If winkel <= 0 : winkel = 360 : EndIf : EndIf 
If KeyboardPushed(#PB_Key_Right) : winkel + 1 : If winkel >= 360 : winkel = 0 : EndIf : EndIf 

; Vorwärts 
If KeyboardPushed(#PB_Key_Up) 
  x=x + Cos(winkel *(2*3.1415/360)) * speed ; Grad zu Bogenmaß 
  y=y + Sin(winkel *(2*3.1415/360)) * speed 
EndIf 

; Rückwärts 
If KeyboardPushed(#PB_Key_Down) 
  x=x + Cos(winkel *(2*3.1415/360)) * -speed 
  y=y + Sin(winkel *(2*3.1415/360)) * -speed 
EndIf 
;---Ende Code Template
If KeyboardReleased(#PB_Key_Add)
  speed=speed+1
EndIf
If KeyboardReleased(#PB_Key_Subtract)
  speed=speed-1
EndIf
If KeyboardReleased(#PB_Key_Space)
  schies=1
  t=0
  xs=x+52
  ys=y+17
EndIf
trans=trans+plus ; sieht cooler aus, find ich ;-)
If trans=255
plus=-1  
EndIf
If trans=0
  plus=1
EndIf
If schies=1
  t=t+1
  xs=xs+speed*t*Cos(winkel) ;Formeln aus dem Tafelwerk
  ys=ys+(-g/2)*Pow(t,2)+speed*t*Sin(winkel)
  DisplayTransparentSprite(2,xs,ys)
EndIf

Start3D()
DisplaySprite3D(1,x,y,trans)
RotateSprite3D(1,winkel,0)
Stop3D()
StartDrawing(ScreenOutput())
Locate(920,10)
DrawingMode(1)
FrontColor(255,255,255)
DrawText("Speed:"+Str(speed))
Locate(920,25)
DrawText(Str(winkel)+"°")
StopDrawing()
FlipBuffers()
ClearScreen(0,0,0)
Until KeyboardPushed(#PB_Key_Escape)
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du hast doch sin() und cos() schon für die bewegung des Sprite drin.

genau das ist der Richtungsvektor des Pfeils
und damit auf die Richtung von seinem Mittelpunkt zu seiner Spitze.

nun musst du nur noch die Differenz LinkeObereEcke zu MIttelpunkt für beide Sprites einbeziehen ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

du hast doch sin() und cos() schon für die bewegung des Sprite drin.
Ja, das ist aber ein Code Template, das ist nicht von mir, ich hab im Moment noch keine Ahnung, was sin und cos bewirkt, ich weiß nicht, villeicht machen wir das dieses jahr mal mit Mathe...(juhu :doh: )
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Kaeru Gaman hat geschrieben:du hast doch sin() und cos() schon für die bewegung des Sprite drin.

genau das ist der Richtungsvektor des Pfeils
und damit auf die Richtung von seinem Mittelpunkt zu seiner Spitze.

nun musst du nur noch die Differenz LinkeObereEcke zu MIttelpunkt für beide Sprites einbeziehen ;)
?
Soll ich jetzt xs=x+Cos(winkel *(2*3.1415/360)) +44und ys=Y+Sin(winkel *(2*3.1415/360)) -22
???
Das hat aber nicht unbedingt den gewünschten effekt...
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ok... dachte das stammt aus deiner feder...

dann mal so:

am anfang

Code: Alles auswählen

#pi=3.14159265
dann in deiner rechnug brauchst du den radiant vom pfeilwinkel...
(weil die sin und cos functions mit radiant rechnen)

der radiant läuft von 0 bis 2*pi, wenn der winkel von 0 bis 360 grad läuft...
(gibts auch tutorials dazu [gibts auch gute? {vllt. sollte ich mal eins schreiben}])

also, mal für die kürze...

mit sin(winkel) bekommst du die x-, mit cos(winkel) die y-koordinate...
(den faktor zw. 0 und 1)
halt winkel in radiant, deshalb (winkel*2*pi/360)

also hast du mit

Code: Alles auswählen

XVerschiebung = PfeilLänge*Sin(Winkel/360*2*#pi)
YVerschiebung = PfeilLänge*Cos(Winkel/360*2*#pi)
X1 = PfeilX + (PfeilSpriteBreite/2)
Y1 = PfeilY + (PfeilSpriteHöhe/2)
KreisMittelX = X1 + XVerschiebung
KreisMittelY = Y1 + YVerschiebung
KreisX = KreismittelX - (KreisSpriteBreite/2)
KreisY = KreismittelY - (KreisSpriteHöhe/2)
und das solltest du halt alles zusammenfassen in eine zeile,
ich hab es nur mal ausführlich gemacht, damit es klarer wird...[/code]
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

...öh...

hat das jetzt was geholfen?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Ich weiß nicht recht...
Was meinst du mit dem Kreis?
und xs=x+Xverschiebung macht auch was komisches...
Ich hab keinen Kreissprite, nur einen Pfeil.
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

mit 'kreis' meinte ich die kugel, die du ja an die spitze des pfeiles setzen willst,
wenn ich dein erstes post richtig verstehe.

> xs = x + xverschiebung macht was komisches

hm... beschreib das mal besser...

ach, ich seh grad... du hast in deinem prog bei x den Cos und bei Y den Sin.
also liegt dein null-grad-punkt nicht oben, sondern rechts...

> der Kreis (den man sich denken kann) um den Pfeil hat einen Durchmesser von 40pxl

...und ich nehme zusätzlich nochmal an, deine kugel sei ein 10x10 sprite

Code: Alles auswählen

xs = x + 20 + 20*Cos(winkel*3.1415927/180) - 5
ys = y + 20 + 20*Sin(winkel*3.1415927/180) - 5
die erste 20 ist die Hälfte der Größe des Pfeilsprites.
die zweite 20 ist die länge das Pfeils von Mittelpunkt bis Spitze.
die 5 ist die Hälfte der Größe deine Kugel. (musst du halt ändern)

Sin und Cos kommen hier genauso rein wie in der berechnung der bewegung,
da ja der abschusspunkt in der bewegungsrichtung liegt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Danke, das funktioniert perfekt! Ich glaube, ich habe dich etwas mit dem code verwirrt,

naja, hier ist er nochmal :)
Achso, meinen Testpfeil und meine Testkugel hab ich jetzt mal hochgeladen.
Bild
Bild

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1024,768,16,"Test")
LoadSprite(1,"pfeil.bmp", #PB_Sprite_Texture)
LoadSprite(2,"kugel.bmp")
TransparentSpriteColor(1,255,0,255)
TransparentSpriteColor(2,255,0,255)
CreateSprite3D(1,1)
Sprite3DQuality(1)
#pi=3.14159265
Global x.w
Global y.w
Global trans.w
Global speed.w
Global plus.b
Global t.f
Global xs.f
Global sprite.b
Global ys.f
Global schies.b
Global g.f
g=-1   ;sonst fällt alles nach oben ^^
plus=1
speed=1
;---Anfang Code Template
; Drehen 
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left) : winkel - 1 :  If winkel <= 0 : winkel = 360 : EndIf : 

EndIf 
If KeyboardPushed(#PB_Key_Right) : winkel + 1 : If winkel >= 360 : winkel = 0 : EndIf : 

EndIf 

; Vorwärts 
If KeyboardPushed(#PB_Key_Up) 
  x=x + Cos(winkel *(2*#pi/360)) * speed ; Grad zu Bogenmaß 
  y=y + Sin(winkel *(2*#pi/360)) * speed 
EndIf 

; Rückwärts 
If KeyboardPushed(#PB_Key_Down) 
  x=x + Cos(winkel *(2*#pi/360)) * -speed 
  y=y + Sin(winkel *(2*#pi/360)) * -speed 
EndIf 
;---Ende Code Template
If KeyboardReleased(#PB_Key_Add)
  speed=speed+1
EndIf
If KeyboardReleased(#PB_Key_Subtract)
  speed=speed-1
EndIf
If KeyboardReleased(#PB_Key_Space)
  schies=1
  t=0
;XVerschiebung=44*Sin(winkel/360*2*#pi)
;YVerschiebung=22*Cos(winkel/360*2*#pi)
;X1 = x + (44/2) 
;Y1 = y + (44/2) 
;KreisMittelX = X1 + XVerschiebung 
;KreisMittelY = Y1 + YVerschiebung 
;KreisX = KreisMittelX - (44/2) 
;KreisY = KreisMittelY - (44/2)
xs=x+22+22*Cos(winkel*3.1415927/180) - (7/2)
ys=y+22+22*Sin(winkel*3.1415927/180) - (7/2)

EndIf
trans=trans+plus ; sieht cooler aus, find ich ;-)
If trans=255
plus=-1  
EndIf
If trans=0
  plus=1
EndIf
If schies=1
;  StartDrawing(ScreenOutput()); ich wollte wissen, was KreisX und Y ist, und wenn man das 

aktiviert und das clearscreen wegacht, entsteht nach einer 360° Drehung eine Elypse.  
;Circle(KreisX,KreisY,22,RGB(255,255,255))
;StopDrawing()
t=t+1
  xs=xs+speed*t*Cos((360-winkel)) ;Formeln aus dem Tafelwerk, muss ich mir nochmal 

ansehen...
  ys=ys+(-g/2)*Pow(t,2)+speed*t*Sin((360-winkel))
  DisplayTransparentSprite(2,xs,ys)
EndIf

Start3D()
DisplaySprite3D(1,x,y,trans)
RotateSprite3D(1,winkel,0)
Stop3D()
StartDrawing(ScreenOutput())
Locate(920,10)
DrawingMode(1)
FrontColor(255,255,255)
DrawText("Speed:"+Str(speed))
Locate(920,25)
DrawText(Str(winkel)+"°")
Locate(920,40)
DrawText("X="+Str(xs))
Locate(920,55)
DrawText("Y="+Str(ys))
StopDrawing()
FlipBuffers()
ClearScreen(0,0,0)
If KeyboardPushed(#PB_Key_0)
  ClearScreen(0,0,0)
EndIf
If KeyboardPushed(#PB_Key_RightAlt)
  GrabSprite(0,0,0,1024,768)
  sprite=sprite+1
  SaveSprite(0,"Screenshot "+Str(sprite)+".bmp")
EndIf
Until KeyboardPushed(#PB_Key_Escape)
Es ist wirklich genial! Die Kugel Kommt wirklich zur Spitze rauS! Jetzt muss ich mir zwar

nochmal die Fallformel anschauen, aber ich hoffe, das kriege ich selber raus...
Achso, dieses Codetempleate hab ich von einem PureBasic editor, der sich "Just another

PureBasic editor" ;) nennt. Ein Freund hat ihn mir mal vor zwei Wochen geschieckt, der ist

echt praktisch! Er hat ne codevervollständigungsfunktion und hat sogar Zusatzfunktionen,

wie es schent, und eben Codetempleates. Es gibt ihn glaube ich auf www.scintilla.org
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

*gg* - Ja ich denke wir alle haben zumindest schon von jaPBe gehört oder benutzen ihn. Kannst auch unter purebasic.de schauen, da ist auch ein Downloadlink. Bloß nicht auf scintilla (hab jaPBe zumindest gerade nicht gefunden) - obwohl das Scintilla-Gadget verwendet wird...

Der Entwickler ist übrigens GPI
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Antworten