Kurvenberechnung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

relentless92

Betreff: Kurvenberechnung

BeitragDi, Sep 22, 2009 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu,
Ich habe ein Problem mit der Kurvenberechnung!
Und zwar habe ich eine fortlaufende Linie welche sich bei gedrückthalten der Maus krümmen soll, und das solange, bis die Maus wieder losgelassen wird.

Ansatz:

Code: [AUSKLAPPEN]
Function Player()

If player=1 Then

p1.player=New player

   p1\x=Rnd(0,100)
   p1\y=Rnd(0,100)
   
   SetBuffer ImageBuffer(bg)
      Plot p1\x,p1\y
   SetBuffer BackBuffer()
   
   p1\verschx=2
   p1\verschy=2
   p1\speedx=2
   p1\speedy=2

player=0   
EndIf

For p1.player=Each player

   p1\x=p1\x+p1\verschx
   p1\y=p1\y+p1\verschy
   
   If MouseDown(1) Then
      p1\verschx=Cos(50)*p1\speedx
      p1\verschy=Cos(50)*p1\speedy
   Else
      p1\verschx=2
      p1\verschy=2
   EndIf
   
   Text 0,120,p1\verschx
   Text 0,130,p1\verschy

   SetBuffer ImageBuffer(bg)
      Plot p1\x,p1\y
   SetBuffer BackBuffer()
   
   
Next


DrawImage bg,0,0

End Function


Problem hierbei ist, das nicht viel passiert. Wenn ich aber
Code: [AUSKLAPPEN]
      p1\verschx=p1\verschx+Cos(50)*p1\speedx
      p1\verschy=p1\verschy+Cos(50)*p1\speedy

benutze, flitzt die Linie aus dem Bildschirm. Logisch, da sich ja auch die Geschwindigkeit erhöht, dabei sollte sich nur die Krümmung "aktivieren".
Wie bekomm ich das hin?

MfG

Rick_72

BeitragMi, Sep 23, 2009 10:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Indem Du statt cos(50) irgendwas ortsabhängiges einsetzt, zB cos(x) etc. cos(50) ist konstant. Da kann ausser einer Linie nichts rauskommen.

Grüße!

ZaP

BeitragMi, Sep 23, 2009 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieh Dir mal Bézierkurven an, das ist genau was Du suchst, und leicht zu implementieren.
Starfare: Worklog, Website (download)

relentless92

BeitragMi, Sep 23, 2009 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh bei der Berechnung der Bezierkurven leider genau 0.
Ich bin grad mal noch Schüler, und sowas hab ich in meinem Leben noch nicht gesehen Wink (11. Klasse atm).

Könnte mir jemand ein anschauliches Beispiel etc. geben? Oder versuchen, es für mein Beispiel zu erklären? Wäre dem jenigen echt dankbar =)

MfG

ZaP

BeitragMi, Sep 23, 2009 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

Const lod# = 0.02

Global x#, y#

Dim PX#(3)
Dim PY#(3)

;kontrollpunkt koordinaten
PX#(0) = 0.1
PX#(1) = 0.9
PX#(2) = 0.9
PX#(3) = 0.1
PY#(0) = 0.1
PY#(1) = 0.1
PY#(2) = 0.9
PY#(3) = 0.9

Local timer = CreateTimer(60)
Local i

Repeat

WaitTimer(timer)

Cls

;Kontrollpunkte durch das Drücken der Tasten 1-3 und die Maus verschieben

If KeyDown(2) Then PX#(0) = Float(MouseX()-2)/100.0 : PY#(0) = Float(MouseY()-2)/100.0
If KeyDown(3) Then PX#(1) = Float(MouseX()-2)/100.0 : PY#(1) = Float(MouseY()-2)/100.0
If KeyDown(4) Then PX#(2) = Float(MouseX()-2)/100.0 : PY#(2) = Float(MouseY()-2)/100.0


;kontrollpunkte darstellen
Color 255, 0, 0
Oval PX#(0)*100-2, PY#(0)*100-2,4,4
Oval PX#(1)*100-2, PY#(1)*100-2,4,4
Oval PX#(2)*100-2, PY#(2)*100-2,4,4

RenderCurve()

Flip 0

Until KeyHit(1)

End


Function RenderCurve()

Color 255, 255, 255
Local dx#, dy#, rx#, ry#
Local index

rx# = PX#(0) * 100.0
ry# = PY#(0) * 100.0

;einzelne Punkte anhand der Kontrollpunkte berechnen, die alle mit dem voherigen Punkt verbunden werden
For x = 0 To 1 Step lod#

;DIE FORMEL
dx# = ( (1-x)^2 * PX#(0) + 2*x*(1-x) * PX#(1) + x^2 * PX#(2) ) * 100
dy# = ( (1-x)^2 * PY#(0) + 2*x*(1-x) * PY#(1) + x^2 * PY#(2) ) * 100

Line rx#, ry#, dx#, dy#

rx# = dx#
ry# = dy#

Next

End Function



Das kann man auch in der 11. Klasse verstehen, man muss es nur wollen Wink
Also hier mein kleines Beispiel, ich hoffe mal Du kannst etwas daraus machen.
Starfare: Worklog, Website (download)

Triton

BeitragMi, Sep 23, 2009 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hätte das jetzt so verstanden, dass die Krümmung der Linie vom Ort der Maus abhängig ist (und ob der Mausbutton gedrückt wird).

Könnte dann z.B so aussehen:

BlitzBasic: [AUSKLAPPEN]
Const gx=800
Const gy=600
Graphics gx,gy,32,2
HidePointer
SetBuffer BackBuffer()

While Not KeyDown(1)
mx = MouseX()
my = MouseY()
Text mx,my, "o"
For ax = 0 To gx-1
If MouseDown(1) Then Plot ax, (gy/2-my)*Sin(-90+ax-mx)+gy/2 Else Line 0,gy/2,gx-1,gy/2
Next
Flip
Cls
Wend
End
Coding: silizium-net.de | Portfolio: Triton.ch.vu

relentless92

BeitragMi, Sep 23, 2009 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir Zap! Das werd ich mir auf jeden mal genauer anschauen und die Kniffe raus lernen Wink

Aber ich glaub mein Problem ist ein bisschen missverstanden worden Wink Wer von euch "Achtung die Kurve!" kennt, weis eher, was ich meine. Wenn man eine Bestimmte Taste drückt (Beliebig), dann soll die Linie, die sich sowieso dauernd nach vorn bewegt, eine Kurve einschlagen. Sie verfolgt also quasi einen Kreisrand, bis man die Taste wieder loslässt!

MfG

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group