Blitz Basic ungenau

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Ctuchik

Betreff: Blitz Basic ungenau

BeitragDi, Feb 01, 2005 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite momentan an einer Kugelsimulation, mit Kugeln die eben möglichst realistisch voneinander abprallen und dabei ist mir aufgefallen, dass BB anscheinend nicht ganz korrekt rechnet!
Im DebugLog stehen die Werte a\x = 224.098 und b\x = 198.112
Wenn man die ganz normal voneinander abzieht mit
RunTimeError (224.098 - 198.112)
25.986
stimmt das Ergebnis, aber das was er berechnet
a\x - b\x ergibt 25.9856
Das macht das ganze Programm kaputt Sad
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!
  • Zuletzt bearbeitet von Ctuchik am Di, Feb 01, 2005 0:53, insgesamt einmal bearbeitet

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Feb 01, 2005 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein schon bekanntes Problem!
Blitz arbeitet nur mit 4 Byte Float im binär Modus
Durch das umrechnen in Dezimal kommmt dann sowas dabei raus
Hier mal ein schönen BeispielCode: [AUSKLAPPEN]
For i# = 0.0 To 1.0 Step 0.01
Print I
Next
WaitKey
[BB2D | BB3D | BB+]

Ctuchik

BeitragDi, Feb 01, 2005 0:53
Antworten mit Zitat
Benutzer-Profile anzeigen
O mann, so ein Schrott! Also kann ich die Genauigkeit vergessen!
Naja ich post gleich mal was ich schon so hab!
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

Ctuchik

BeitragDi, Feb 01, 2005 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaja, Doppelpost schon gut!
Mit Leertaste wirds neu gestartet!
Kollision mit Wänden is noch nicht eingebaut!

Code: [AUSKLAPPEN]

Const scr_width = 800
Const scr_height = 600

Graphics scr_width,scr_height,0,2
SetBuffer BackBuffer()

Global timer1 = CreateTimer(60)
Global energie# = 0

Type Kugel
  Field x#,y#
  Field vx#,vy#
  Field tu#
  Field r#
   Field clr%
  Field lastcoll.Kugel
End Type

Type Kollision
  Field eins.Kugel
  Field zwei.Kugel
  Field time#
End Type

SeedRnd MilliSecs()

.reset

For k.Kugel = Each Kugel
  Delete k
Next

;Billiard
CreateKugel(250,300,0,0,15,255,0,0)
CreateKugel(224,316,0,0,15,255,0,0)
CreateKugel(224,284,0,0,15,255,0,0)
CreateKugel(198,331,0,0,15,255,0,0)
CreateKugel(198,300,0,0,15,255,0,0)
CreateKugel(198,269,0,0,15,255,0,0)
CreateKugel(172,347,0,0,15,255,0,0)
CreateKugel(172,316,0,0,15,255,0,0)
CreateKugel(172,284,0,0,15,255,0,0)
CreateKugel(172,253,0,0,15,255,0,0)
CreateKugel(500,300,-11,Rnd(-1.5,1.5),15,255,255,255)

;CreateKugel(250,300,0,0,20,255,0,0)
;CreateKugel(290,300,0,0,15,255,0,0)
;CreateKugel(325,300,0,0,5,255,0,0)
;CreateKugel(550,300,-3,0,15,255,255,255)

;CreateKugel(25,585,0,0,255,0,0)
;CreateKugel(75,585,0,0,255,0,0)
;CreateKugel(125,585,0,0,255,0,0)
;CreateKugel(175,585,0,0,255,0,0)
;CreateKugel(225,585,0,0,255,0,0)
;CreateKugel(275,585,0,0,255,0,0)
;CreateKugel(325,585,0,0,255,0,0)
;CreateKugel(375,585,0,0,255,0,0)
;CreateKugel(425,585,0,0,255,0,0)
;CreateKugel(475,585,0,0,255,0,0)
;CreateKugel(525,585,0,0,255,0,0)
;CreateKugel(575,585,0,0,255,0,0)
;CreateKugel(625,585,0,0,255,0,0)
;CreateKugel(675,585,0,0,255,0,0)
;CreateKugel(725,585,0,0,255,0,0)
;CreateKugel(775,585,0,0,255,0,0)
;CreateKugel(100,100,0,0,255,255,255)

Repeat
  If KeyHit(57) Goto reset
  WaitTimer(timer1)
  Update()
  Render()
  Flip
  Cls
  Until KeyHit(1)
End

Function Update()

  kollision_fertig = False
 
  energie# = 0.0
  tu# = 0.0
 
  For a.Kugel = Each Kugel
    a\tu# = 0.0
    a\lastcoll = Null
    energie# = energie# + 0.5 * ((a\vx)^2 + (a\vy^2))
  Next

  Repeat
 
  For a.Kugel = Each Kugel
    For b.Kugel = Each Kugel
      If (a <> b) And ((a\lastcoll <> b) Or (b\lastcoll <> a))
     
        d# = (a\x - b\x)
        e# = (a\vx - b\vx)
        n# = (a\y - b\y)
        u# = (a\vy - b\vy)
        qa# = (e^2 + u^2)
        qb# = 2*(d*e + n*u)
        qc# = (d^2 + n^2) - (a\r + b\r)^2
       
        w# = qb^2 - 4*qa*qc
        If (w# < 0) Then
          collision = False
        Else
          w# = Sqr(w#)
          t1# = (-qb + w) / (2*qa)
          t2# = (-qb - w) / (2*qa)
          tu# = a\tu
              t# = -1
          If ((t1 >= 0) And (t1 <= (1.0 - tu))) Then t# = t1
          If (((t2 >= 0) And (t2 <= (1.0 - tu))) And ((t# <> -1) Or (t2 < t1))) Then t# = t2
          If (t# <> -1) Then
            collision = True
               Else
                 collision = False
              End If
           End If
       
        If collision Then
          ;Kollision registrieren
          newcol.Kollision = New Kollision
          newcol\eins.Kugel = a
          newcol\zwei.Kugel = b
         
          Repeat
            anx# = a\x# + a\vx#*(t# - buffer#)
            any# = a\y# + a\vy#*(t# - buffer#)
            bnx# = b\x# + b\vx#*(t# - buffer#)
            bny# = b\y# + b\vy#*(t# - buffer#)
            If ((anx - bnx)^2 + (any - bny)^2) < (a\r + b\r)^2 Then
                 buffer# = buffer# + 0.000001
               Else
                 Exit
                End If
          Forever   
               
          newcol\time# = t# - buffer#
        End If
       
      End If
    Next
  Next
 
  ;Kleinstes suchen
 
  If (First Kollision = Null)
    kollision_fertig = True
  Else
 
    early.Kollision = First Kollision
    For col.Kollision = Each Kollision
      If (col\time# < early\time#) Then early = col
    Next
 
    a = early\eins
    b = early\zwei
    a\lastcoll = b
    b\lastcoll = a
 
    For k.Kugel = Each Kugel
      k\x# = k\x# + k\vx#*(early\time#)
      k\y# = k\y# + k\vy#*(early\time#)
    Next
    tu# = early\time#
 
    ;Kollidieren
 
    wi# = ((b\y# - a\y#) / (b\x# - a\x#))

    apx# = (wi * a\vy + a\vx) / (wi^2 + 1)
    asy# = a\vy - wi*apx
    bpx# = (wi * b\vy + b\vx) / (wi^2 + 1)
    bsy# = b\vy - wi*bpx
    anx# = bpx + a\vx - apx
    any# = b\vy - bsy + asy
    bnx# = apx + b\vx - bpx
    bny# = a\vy - asy + bsy
       
    a\vx# = anx#
    a\vy# = any#
    b\vx# = bnx#
    b\vy# = bny#
 
    For col.Kollision = Each Kollision
      Delete col
    Next
   
  End If
 
  Until (kollision_fertig)
 
  For a.Kugel = Each Kugel
    a\x# = a\x# + a\vx#*(1.0 - a\tu#)
    a\y# = a\y# + a\vy#*(1.0 - a\tu#) 
  Next
 
End Function

Function Render()
  For k.Kugel = Each Kugel
    Color 0,0,k\clr
    Oval Int(k\x#-k\r),Int(k\y#-k\r),2*k\r,2*k\r
  Next
 
  Color 0,255,0
  Text 10,10,"Energie: " + energie,0,0
 
End Function

Function CreateKugel.Kugel(x#,y#,vx#,vy#,rad%,r%,g%,b%)
  newkugel.Kugel = New Kugel
  newkugel\x# = x#
  newkugel\y# = y#
  newkugel\vx# = vx#
  newkugel\vy# = vy#
  newkugel\r% = rad%
  newkugel\clr% = $10000 * r + $100 * g + b
  Return newkugel
End Function
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

D2006

Administrator

BeitragDi, Feb 01, 2005 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
top!

Was man so erkennen kann, keine groben physikalischen Fehler.

Meinen Respekt hast du!

Gute Ausgangslage für ein Billard. In die Richtung was geplant?

MfG
D2006

Ctuchik

BeitragMi, Feb 02, 2005 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Smile

Momentan hab ich nicht geplant daraus eine Billardsimulation zu machen, aber was noch nicht ist kann ja noch werden!
Ich hatte einfach mal Lust sowas zu simulieren, weil ich das früher schon zweimal versucht habe, damals aber einfach nicht den richtigen Ansatz gefunden habe!

Was ich noch einbauen will sind Wände mit beliebigem Winkel, dann schau ich ob ich ein Billard draus mach!

MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group