Simulation der Anziehungskraft zwischen (mehreren) Massen ..

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Markus2

Betreff: Simulation der Anziehungskraft zwischen (mehreren) Massen ..

BeitragSa, Jan 17, 2004 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Man hat ja sonnst nix zu tun 8)

Simulation der Anziehungskraft zwischen Massen Shocked

In 3D und 2D Idea

Code: [AUSKLAPPEN]


;Simulation der Anziehungskraft zwischen (mehreren) Massen mit Spielerei :-) von M.Rauch Jan 2004

;BlitzBasic 2D 3D mit Umschaltmodus !

;MR 16.01.2004

;###############################################################

; Kurzanleitung

; Wenn Constante Mode3D=0 dann hat man die 2D Ansicht von Vorne 
; und bei BallNew wird Position Z=0

; 3D
; Linke Maustaste = Objekt Fixieren An/Aus
; Rechte Maustaste = Objekt Wegstoßen
; Enter wenn Maus über Objekt = Objekt auf Null Punkt setzen

; 2D
; Linke Maustaste über Kreis = Objekt bewegen

;###############################################################

Const Mode3D=1

;###############################################################

If Mode3D=1 Then
 Graphics3D 1024,768,16,2
Else
 Graphics 1280,1024,16,2
EndIf

AppTitle "Simulation der Anziehungskraft zwischen (mehreren) Massen mit Spielerei :-) von M.Rauch Jan 2004"

SetBuffer BackBuffer()

;###############################################################

Global cam
If Mode3D=1 Then
 cam=CreateCamera()
 CameraRange cam,0.1,10000
 CameraZoom cam,2
 PositionEntity cam,0,0,-20
EndIf

;###############################################################

Global light
If Mode3D=1 Then
 AmbientLight 16,16,16
 light=CreateLight(2)
 LightRange light,75
 PositionEntity light,EntityX(cam)-10,EntityY(cam)+10,EntityZ(cam)-10
EndIf

;###############################################################

Global myFont=LoadFont("FixedSys",9)
SetFont myFont 

;###############################################################

Type V3D ;Vector
 Field x#
 Field y#
 Field z#
End Type

Global DummyV3D.V3D=New V3D

;###############################################################

Type BallType
 Field Entity
 Field EntityFix
 Field plast.V3D           ;Positions Vector zuletzt
 Field p.V3D               ;Positions Vector
 Field d.V3D               ;Richtungs Vector
 Field Geschwindigkeit.V3D ;v in Meter/Sekunde m/s
 Field Beschleunigung#     ;a in Meter/Sekunde² m/s²
 Field Masse#              ;m in Kilogramm kg
 Field Radius#             ;r in Meter m
 Field Kraft#              ;F in Newton N
 Field RGB                 ;Farbe in Bunt
 Field Colli               ;Collision in Bit
 Field Moveable            ;1=bewegbar 0=keine Geschwindigkeit
End Type

Global Ball.BallType

Global BallEntity
If Mode3D=1 Then
 BallEntity=CreateSphere(16)
 HideEntity BallEntity
 EntityShininess BallEntity,0.25
 EntityAlpha BallEntity,0.90       ;beim Auskommentieren sieht man den Fix Punkt nicht !
EndIf

;###############################################################

Type WegType
 Field Entity
 Field x#
 Field y#
 Field z#
 Field RGB
End Type
Global Weg.WegType

Global WegEntity
If Mode3D=1 Then
 WegEntity=CreateCube()
 HideEntity WegEntity
EndIf

;###############################################################

BallNew -3, 3 ,-3,175,RGB(255,0,0),0
BallNew  3,-3 , 3,175,RGB(255,0,0),0

BallNew 0,0 ,3,25,RGB(255,128,64),1

BallNew 0,2 ,2,50,RGB(255,255,0),1

BallNew 0,-2 ,1,28,RGB(0,255,0),1

BallNew 0,-3 ,-2,22,RGB(0,0,255),1

;###############################################################

 ;F=Kraft in 1 Newton = N

 ;m=Masse in 1 Kilogramm = kg -> 1 t(Tonne) = 1000 kg

 ;M=Drehmoment in 1 Newtonmeter = Nm
 
 ;v=Geschwindigkeit in m/s = delta x / delta t ist auch x' oder auch Strecke/Zeit also s/t
 ;Beispiel 100 km/h = 100 km pro Stunde
 ;x ist in Meter
 ;t ist in Sekunden
 ;100 km sind 100m*1000=100000m
 ;1 Std. hat 3600 Sekunden
 ;100000m / 3600s = 27.777777 ms
 ;von meter in der sekunde zu km/h ist m/s * 3.6
 ;=99.999997 km/h

 ;a=Beschleunigung im Meter/(Sekunde*Sekunde) = m/s²
 ;a=delta v / delta t ist auch v'

 ;F=Kraft in N -> muss man zufügen um bei xxx Kilogramm was zu beschleunigen !
   
 ;F=m*a

 ;a= (F / m)  -> a = Beschleunigung in m/s2
 
 ;G=m*g -> g = Fallbeschleunigung in m/s² z.B.  9.81 und G = Gewichtskraft in Newton
 
 ;g=G / m

;###############################################################

Main
End

Function Main()

 Local ti#

 Local mx#,my#

 Local e

 While Not KeyHit(1) ;ESC

  ti=MilliSecs()

  If Mode3D=0 Then
   Cls
  EndIf

  mx=MouseX()
  my=MouseY()

  If MouseDown(1)=True And Mode3D=0 Then BallMausTest mx,my

  BallGravity      ;Kraft erzeugen
  BallAcceleration ;Beschleunigen also Geschwindigkeit +-
  BallMove             ;mit der Geschwindigkeit bewegen   

  WegShow          ;Spur anzeigen :-)
  BallShow         ;und zeigen :-)
  BallShowRichtung ;Ja wo will er denn hin ?

  If Mode3D=1 Then
   If MouseHit(2)>0 Then     ;Rechte Maustaste
    e=CameraPick(cam,mx,my)
    If e Then BallKick e
   EndIf
   If MouseHit(1)>0 Then     ;Linke Maustaste
    e=CameraPick(cam,mx,my)
    If e Then BallToggleFix e
   EndIf
   If KeyDown(28) Then       ;Enter wenn Maus über Objekt
    e=CameraPick(cam,mx,my)
    If e Then BallZero e   
   EndIf
   RenderWorld
  EndIf

  ;BallStatus

  While Abs(MilliSecs()-ti)<20
  Wend
 
  Flip

 Wend

 Delete Each V3D
 Delete Each BallType
 WegFreeAll

End Function

;###############################################################

Function BallNew(px#,py#,pz#,Masse#,RGB,Moveable)

 Ball.BallType = New BallType

 Ball\Kraft          =0.0
 Ball\Beschleunigung =0.0

 Ball\Moveable=Moveable

 Ball\Geschwindigkeit=newV3D(0.0,0.0,0.0)

 Ball\Masse =Masse
 Ball\Radius=Masse/100.0

 If Mode3D=1 Then
  Ball\Entity=CopyEntity(BallEntity)
  ScaleEntity Ball\Entity,Ball\Radius,Ball\Radius,Ball\Radius
  Color 0,0,RGB
  EntityColor Ball\Entity,ColorRed(),ColorGreen(),ColorBlue()
  EntityRadius Ball\Entity,Ball\Radius
  EntityPickMode Ball\Entity,1
  NameEntity Ball\Entity,"Ball"
 EndIf

 If Mode3D=1 Then
  Ball\EntityFix=CopyEntity(WegEntity)
  ScaleEntity Ball\EntityFix,Ball\Radius/10.0,Ball\Radius/10.0,Ball\Radius/10.0
  If Moveable=1 Then
   HideEntity Ball\EntityFix
  EndIf
 Else
  pz=0
 EndIf

 Ball\p    =newV3D(px,py,pz)
 Ball\plast=newV3D(px,py,pz)
 Ball\d    =newV3D(0,0,0)

 Ball\RGB=RGB

End Function

;###############################################################

Function BallGravity()

 ;Local G#=6.6726 * 10^-11

 Local G#

 If Mode3D=1 Then
  G=6.6726 * 10^-2
 Else
  G=6.6726 * 10^-3
 EndIf

 ;DebugLog G

 Local BallX.BallType

 Local m1#,m2#,r2#

 Local F#

 For Ball.BallType = Each BallType
  Ball\Kraft=0.0
  m1=Ball\Masse
  For BallX.BallType = Each BallType
   If Ball<>BallX Then
    m2=BallX\Masse 
    r2=VENT(Ball\p,BallX\p)^2.0
    If Abs(r2)=>(Ball\Radius+BallX\Radius)^2 Then ;TEST damit es spannender ist ;-)
     F#=G*((m1*m2)/r2)
     Ball\Kraft=Ball\Kraft+F
    EndIf
   EndIf
  Next
 Next

 ;Bewegen wir uns da hin wo die meiste Kraft ist

 Local F1#
 Local F2#
 Local FG#

 Local d.V3D = New V3D
 Local dg.V3D = New V3D

 Local anz=0
 For Ball.BallType = Each BallType
  anz=anz+1
 Next

 For Ball.BallType = Each BallType
  F1=Ball\Kraft
  FG=0.0
  dg\x=0.0
  dg\y=0.0
  dg\z=0.0
  For BallX.BallType = Each BallType
   If Ball<>BallX Then
    F2=BallX\Kraft
    VDIR Ball\p,BallX\p,d
    d\x=d\x*F2
    d\y=d\y*F2
    d\z=d\z*F2
    VADD dg,d,dg
    FG=FG+F2
   EndIf
  Next
  Ball\d\x=dg\x / FG
  Ball\d\y=dg\y / FG
  Ball\d\z=dg\z / FG
 Next

 Delete d
 Delete dg

End Function

;###############################################################

Function BallAcceleration()

 ;a= (F / m)

 Local a#

 For Ball.BallType = Each BallType
  Ball\Beschleunigung=Ball\Kraft / Ball\Masse
  a=MeterJeSekunde(Ball\Beschleunigung)
  Ball\Geschwindigkeit\x=Ball\Geschwindigkeit\x+(a*Ball\d\x)
  Ball\Geschwindigkeit\y=Ball\Geschwindigkeit\y+(a*Ball\d\y)
  Ball\Geschwindigkeit\z=Ball\Geschwindigkeit\z+(a*Ball\d\z)
 Next

End Function

;###############################################################

Function BallMove()

 Local p1.V3D = New V3D ;Position
 Local p2.V3D = New V3D
 Local BallX.BallType

 ;Simulieren wo beide hin wollen

 For Ball.BallType = Each BallType
  Ball\Colli=0
  If Ball\Moveable=0 Then
   Ball\Geschwindigkeit\x=0.0
   Ball\Geschwindigkeit\y=0.0
   Ball\Geschwindigkeit\z=0.0
  EndIf
 Next

 For Ball.BallType = Each BallType

  p1\x=Ball\p\x+Ball\Geschwindigkeit\x
  p1\y=Ball\p\y+Ball\Geschwindigkeit\y
  p1\z=Ball\p\z+Ball\Geschwindigkeit\z

  For BallX.BallType = Each BallType
   If Ball<>BallX Then ;And (Ball\Colli=0 And BallX\Colli=0) Then

    p2\x=BallX\p\x+BallX\Geschwindigkeit\x
    p2\y=BallX\p\y+BallX\Geschwindigkeit\y
    p2\z=BallX\p\z+BallX\Geschwindigkeit\z
 
    If VENT(p1,p2) <= (Ball\Radius+BallX\Radius)+0.01 Then
     ;Stop
     BallBounce Ball ,BallX,p1,p2
     Ball\Colli=Ball\Colli+1
     BallX\Colli=BallX\Colli+1
    Else
     ;Ball\Colli=0
     ;BallX\Colli=0
    EndIf

   EndIf
  Next

 Next

 ;Bischen Reibung

 For Ball.BallType = Each BallType
  ;If Ball\Colli=>1 Then
   Ball\Geschwindigkeit\x=Ball\Geschwindigkeit\x*0.99
   Ball\Geschwindigkeit\y=Ball\Geschwindigkeit\y*0.99
   Ball\Geschwindigkeit\z=Ball\Geschwindigkeit\z*0.99
  ;EndIf
 Next

 ;Jetzt erst bewegen !
 ;aber nur wenn man nicht irgendwo drin landet !

 Local drin

 For Ball.BallType = Each BallType

  VADD Ball\p,Ball\Geschwindigkeit,p1

  drin=0

  For BallX.BallType = Each BallType
   If Ball<>BallX Then
 
    If VENT(p1,BallX\p) <= (Ball\Radius+BallX\Radius) Then ;+0.01
     ;drin=1
     If SphereIntersect(p1,Ball\d,BallX\p,Ball\Radius,BallX\Radius,p1)=True Then
     EndIf   
     Exit
    EndIf

   EndIf
  Next

  If drin=0 Then
   VADD Ball\p,Ball\Geschwindigkeit,Ball\p
   If VENT(Ball\plast,Ball\p)>0.1 Then
    VCOPY Ball\p,Ball\plast
    WegNew Ball
   EndIf
  EndIf

 Next

 Delete p1
 Delete p2

End Function

;###############################################################

Function BallShow()

 Local x#,y#,z#
 Local r#

 For Ball.BallType = Each BallType

  If Mode3D=1 Then
   PositionEntity Ball\Entity   ,Ball\p\x,Ball\p\y,Ball\p\z
   If Ball\EntityFix Then
    PositionEntity Ball\EntityFix,Ball\p\x,Ball\p\y,Ball\p\z
   EndIf
  Else
   x=Ball\p\x
   y=Ball\p\y
   z=Ball\p\z
   r=Ball\Radius
   Color 0,0,Ball\RGB
   Circle x,y,r
  EndIf

 Next

 If Mode3D=0 Then
  ;Wenn er fest steht dann ein Kreuz malen
  Color 128,128,128
  For Ball.BallType = Each BallType
   If Ball\Moveable=0 Then
    toV3D DummyV3D,-1,0,0
    LineMeter Ball\p,DummyV3D,Ball\Radius/10.0
    toV3D DummyV3D, 1,0,0
    LineMeter Ball\p,DummyV3D,Ball\Radius/10.0
    toV3D DummyV3D,0,-1,0
    LineMeter Ball\p,DummyV3D,Ball\Radius/10.0
    toV3D DummyV3D,0, 1,0
    LineMeter Ball\p,DummyV3D,Ball\Radius/10.0
   EndIf
  Next
 EndIf

End Function

;###############################################################

Function BallShowRichtung()

 If Mode3D=1 Then Return

 ;2D

 Color 255,255,255
 For Ball.BallType = Each BallType
  LineMeter Ball\p,Ball\d,Ball\Radius
 Next

End Function

;###############################################################

Function BallStatus()

 Local fy=12
 Local i=0

 Local x=10:y=10

 For Ball.BallType = Each BallType

  Color 0,0,Ball\RGB
 
  i=i+1
  Text x,y,"Ball Nummer       " + i                    :y=y+fy
  Text x,y,"Kraft             " + Ball\Kraft           :y=y+fy
  Text x,y,"Beschleunigung    " + Ball\Beschleunigung  :y=y+fy

  Text x,y,"Geschwindigkeit X " + Ball\Geschwindigkeit\x :y=y+fy
  Text x,y,"Geschwindigkeit Y " + Ball\Geschwindigkeit\y :y=y+fy
  Text x,y,"Geschwindigkeit Z " + Ball\Geschwindigkeit\z :y=y+fy

  Text x,y,"Masse             " + Ball\Masse           :y=y+fy
  Text x,y,"Radius            " + Ball\Radius          :y=y+fy


  Text x,y,"Richtung X        " + Ball\d\x             :y=y+fy
  Text x,y,"Richtung Y        " + Ball\d\y             :y=y+fy
  Text x,y,"Richtung Z        " + Ball\d\z             :y=y+fy

  Text x,y,"Position X        " + Ball\p\x             :y=y+fy
  Text x,y,"Position Y        " + Ball\p\y             :y=y+fy
  Text x,y,"Position Z        " + Ball\p\z             :y=y+fy

  Text x,y,"Colli             " + Ball\Colli           :y=y+fy

  y=y+fy
 Next

End Function

;###############################################################

Function BallMausTest(mx#,my#)

 ;Reinklicken und bewegen :-)

 mx=(mx-GraphicsWidth() /2.0)/100.0
 my=(my-GraphicsHeight()/2.0)/100.0

 For Ball.BallType = Each BallType
  If Entf2D(Ball\p\x,Ball\p\y,mx,my) < Ball\Radius Then
   Ball\p\x=mx
   Ball\p\y=my
   Ball\p\z=0.0
   Ball\Geschwindigkeit\x=0.0
   Ball\Geschwindigkeit\y=0.0
   Ball\Geschwindigkeit\z=0.0
   Exit
  EndIf
 Next

End Function

;###############################################################

Function BallToggleFix(Entity)

 ;3D

 ;Fix Punkt An/Aus :-)

 For Ball.BallType = Each BallType
  If Ball\Entity=Entity Then
   Ball\Moveable=1-Ball\Moveable
   If Ball\Moveable=1 Then
    HideEntity Ball\EntityFix
   Else
    ShowEntity Ball\EntityFix
   EndIf
   Exit
  EndIf
 Next

End Function

;###############################################################

Function BallKick(Entity)

 ;3D

 ;Anstoßen :-)

 For Ball.BallType = Each BallType
  If Ball\Entity=Entity Then
   If Ball\p\z > EntityZ(cam) And Ball\p\z<10.0 Then
    Ball\Geschwindigkeit\z=Ball\Geschwindigkeit\z+0.5
   Else
    Ball\Geschwindigkeit\z=Ball\Geschwindigkeit\z-0.5
   EndIf
   Exit
  EndIf
 Next

End Function

;###############################################################

Function BallZero(Entity)

 ;3D

 ;Zu 0,0,0

 For Ball.BallType = Each BallType
  If Ball\Entity=Entity Then
   toV3D Ball\p,0.0,0.0,0.0
   toV3D Ball\Geschwindigkeit,0.0,0.0,0.0
   Exit
  EndIf
 Next

End Function

;###############################################################

Function Circle(x#,y#,r#)

 ;Parameter in Meter darum * 100.0

 ;1 Meter = 100 Pixel

 x=to2DX(x)
 y=to2DY(y)

 r=to2D(r)

 Oval x-r,y-r,r*2.0,r*2.0,False

End Function

;###############################################################

Function Entf2D(x1#,y1#,x2#,y2#)

 Local dx#,dy#

 dx#=x2#-x1#
 dy#=y2#-y1#

 Return Sqr(dx*dx + dy*dy)

End Function

;###############################################################

.Vectoren

Function toV3D.V3D(v.V3D,x#, y#, z#)

 ;MR 22.06.2003

 ;V must be exist !

 V\x = x
 V\y = y
 V\z = z

 Return v

End Function

;###############################################################

Function newV3D.V3D(x#, y#, z#)

 ;MR 22.06.2003

 Local v.V3D=New V3D

 V\x = x
 V\y = y
 V\z = z

 Return v

End Function

;###############################################################

Function VDIR(v1.V3D,v2.V3D,d.V3D)

 ;MR 15.01.2004

 Local hyp#
 
 d\x = v2\x-v1\x
 d\y = v2\y-v1\y
 d\z = v2\z-v1\z
 
 hyp = Sqr(d\x * d\x + d\y * d\y + d\z * d\z)
 
 If hyp <> 0.0 Then
  d\x = d\x / hyp
  d\y = d\y / hyp
  d\z = d\z / hyp
 Else
  d\x = 0.0
  d\y = 0.0
  d\z = 0.0
 End If
 
End Function

;###############################################################

Function VADD(v1.V3D,v2.V3D,v3.V3D)

 ;MR 15.01.2004
 
 v3\x = v1\x + v2\x
 v3\y = v1\y + v2\y
 v3\z = v1\z + v2\z
   
End Function

;###############################################################

Function VSUB(v1.V3D,v2.V3D,v3.V3D)

 ;MR 15.01.2004
 
 v3\x = v1\x - v2\x
 v3\y = v1\y - v2\y
 v3\z = v1\z - v2\z
   
End Function

;###############################################################

Function VCOPY(v.V3D, vout.V3D)

 ;MR 22.06.2003
 
 ;=
 
 vout\x = v\x
 vout\y = v\y
 vout\z = v\z

End Function

;###############################################################

Function VMUL(v1.V3D, v2.V3D,vout.V3D)

 ;MR 22.06.2003
 
 ;*
 
 vout\x = v1\x * v2\x
 vout\y = v1\y * v2\y
 vout\z = v1\z * v2\z

End Function

;###############################################################

Function VENT#(a.V3D, b.V3D)
 
 ;MR 22.06.2003
 
 ;Entfernung

 Local ve.V3D=New V3D
 Local e#

 VSUB b, a,ve
 
 e = Sqr(ve\x * ve\x + ve\y * ve\y + ve\z * ve\z)

 Delete ve

 Return e
 
End Function

;###############################################################

Function VINV(a.V3D,b.V3D)

 ;MR 22.06.2003
   
 ;Invertiert Vector , aus Plus wird Minus und umgekehrt
 
 b\x = -a\x
 b\y = -a\y
 b\z = -a\z

End Function

;###############################################################

Function VDOT#(a.V3D, b.V3D)
 
 ;MR 22.06.2003

 ;Dotprodukt - Skalarprodukt
 
 ;berechnet ein Skalarprodukt zweier Vectoren
 
 Return (a\x * b\x + a\y * b\y + a\z * b\z)
 
End Function

;###############################################################

Function VNORM(a.V3D)

 ;MR 22.06.2003
 
 ;gibt Normvector zurück , aufpassen auf überlauf !
 
 Local fa#
 
 fa = Sqr(VDOT(a, a))
 
 If fa = 0 Then
  a\x = 0
  a\y = 0
  a\z = 0
 Else
  fa = 1.0 / fa
  a\x = a\x * fa
  a\y = a\y * fa
  a\z = a\z * fa
 End If
 
End Function

;###############################################################

Function VCROSS(a.V3D,b.V3D,c.V3D)
 
 ;MR 22.06.2003
 
 ;gibt Vectorprodukt zurück
 
 c\x = a\y * b\z - b\y * a\z
 c\y = a\z * b\x - b\z * a\x
 c\z = a\x * b\y - b\x * a\y
 
End Function

;###############################################################

Function SphereIntersect(start.V3D, dir.V3D, kugel.V3D,Radius1#,Radius#,colli.V3D)

 ;MR 22.06.2003
 
 Local a#
 Local b#
 Local c#
 Local t1#
 Local t2#
 
 Local Radius2#
 
 Radius2 = Radius * Radius
 
 a = dir\x * dir\x + dir\y * dir\y + dir\z * dir\z
 b = 2.0 * dir\x * (start\x - kugel\x) + 2.0 * dir\y * (start\y - kugel\y) + 2.0 * dir\z * (start\z - kugel\z)
 c = kugel\x * kugel\x + kugel\y * kugel\y + kugel\z * kugel\z + start\x * start\x + start\y * start\y + start\z * start\z - 2.0 * (kugel\x * start\x + kugel\y * start\y + kugel\z * start\z) - Radius2

 Local discriminant#
 discriminant = b * b - 4.0 * a * c

 If discriminant >= 0.0 Then
  Local t#
  t=-(b/2.0)+Sqr(discriminant) ;Da ist der Aufprallpunkt
  t=t-Radius1                  ;wieder zurück
  t=t+0.001 ;bischen nach außen
  ;Stop
  colli\x=start\x+dir\x*t
  colli\y=start\y+dir\y*t
  colli\z=start\z+dir\z*t
  Return True ;Intersection
 End If
 
 Return False
   
End Function

;###############################################################

Function Round2#(x#)

 ;MR 14.04.2003

 Return Int(x*100.0)/100.0

End Function

;--------------------------------------------------------

Function Round4#(x#)

 ;MR 14.04.2003

 Return Int(x*10000.0)/10000.0

End Function

;###############################################################

Function ms_to_kmh#(ms#)
 
 ;MR 21.04.2003
 
  ;1 Kilometer = 1000 Meter
  ;1 Stunde hat 3600 Sekunden
 
  ;Ret : v = Geschwindigkeit in Kilometer/Stunde = km/h

  ;(ms / 1000.0) * 3600.0 ;sekunden
 
  Return ms * 3.60
 
End Function

;###############################################################

Function MeterJeSekunde#(ms#)

 Return ms * 0.02

End Function

;###############################################################

Function RGB(r,g,b)

 Return ((r * $10000) Or (g * $100) Or b)

End Function

;###############################################################

Function mMax#(a#, b#)
 
 ;MR 22.06.2003
 
 If a > b Then
  Return a
 Else
  Return b
 End If
 
End Function

;###############################################################

Function mMin#(a#, b#)
 
 ;MR 22.06.2003
 
 If a < b Then
  Return a
 Else
  Return b
 End If
 
End Function

;###############################################################

Function sqare#(x#)

 ;MR 23.06.2003

 Return (x * x)

End Function

;###############################################################

Function BallBounce(b1.BallType,b2.BallType,p1.V3D,p2.V3D)

 ;MR 16.01.2004

 ;VV Vector Richtung 
 ;VN Vector Collisions Oberflächennormale

 Local dc.V3D = New V3D

 VDIR p1,p2,dc

 Local vdot1#
 Local vdot2#
 Local optimizedP#
 
 vdot1=b1\Geschwindigkeit\x*dc\x + b1\Geschwindigkeit\y*dc\y + b1\Geschwindigkeit\z*dc\z
 vdot2=b2\Geschwindigkeit\x*dc\x + b2\Geschwindigkeit\y*dc\y + b2\Geschwindigkeit\z*dc\z

 optimizedP = (2.0 * (vdot1-vdot2)) / (b1\Masse + b2\Masse)

 b1\Geschwindigkeit\x =b1\Geschwindigkeit\x - optimizedP * b2\Masse * dc\x
 b1\Geschwindigkeit\y =b1\Geschwindigkeit\y - optimizedP * b2\Masse * dc\y
 b1\Geschwindigkeit\z =b1\Geschwindigkeit\z - optimizedP * b2\Masse * dc\z

 b2\Geschwindigkeit\x =b2\Geschwindigkeit\x - optimizedP * b1\Masse * -dc\x
 b2\Geschwindigkeit\y =b2\Geschwindigkeit\y - optimizedP * b1\Masse * -dc\y
 b2\Geschwindigkeit\z =b2\Geschwindigkeit\z - optimizedP * b1\Masse * -dc\z

 Delete dc

End Function

;###############################################################

Function WegNew(b.BallType)

 Local c

 Local WegFirst.WegType

 For Weg.WegType = Each WegType
  c=c+1 
  If c=100 Then
   WegFirst= First WegType
   WegFree WegFirst
   Exit
  EndIf
 Next

 Weg.WegType = New WegType

 If Mode3D=1 Then
  Weg\Entity=CopyEntity(WegEntity)
  ScaleEntity Weg\Entity,0.025,0.025,0.025
  Color 0,0,b\RGB
  EntityColor Weg\Entity,ColorRed(),ColorGreen(),ColorBlue()
 EndIf

 Weg\x=b\p\x
 Weg\y=b\p\y
 Weg\z=b\p\z
 Weg\RGB=b\RGB

End Function

;###############################################################

Function WegShow()

 For Weg.WegType = Each WegType
  If Mode3D=1 Then
   PositionEntity Weg\Entity,Weg\x,Weg\y,Weg\z
  Else
   Color 0,0,Weg\RGB
   PlotMeter Weg\x,Weg\y,Weg\z
  EndIf
 Next

End Function

;###############################################################

Function WegFreeAll()

 For Weg.WegType = Each WegType
  WegFree Weg
 Next

End Function

;###############################################################

Function WegFree(W.WegType)

 If W\Entity Then FreeEntity W\Entity
 Delete W

End Function

;###############################################################

Function PlotMeter(x#,y#,z#)

 x=to2DX(x)
 y=to2DY(y)

 Plot x,y

End Function

;###############################################################

Function LineMeter(v.V3D,d.V3D,l#)

 Local x1#,y1#,x2#,y2#

 x1=to2DX(v\x)
 y1=to2DY(v\y)

 x2=to2DX(v\x+d\x*l)
 y2=to2DY(v\y+d\y*l)

 Line x1,y1,x2,y2

End Function

;###############################################################

Function to2D#(l#)

 Return l#*100.0

End Function

Function to2DX#(x#)

 Return x#*100.0+GraphicsWidth()/2.0

End Function

Function to2DY#(y#)

 Return y#*100.0+GraphicsHeight()/2.0

End Function

;###############################################################

 

junky

BeitragSa, Jan 17, 2004 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
eigentlich schade ... häts gern ma angeschaut
aber wenn man "nur" BB2D besitzt, erkennt er die befehle allgemein nicht ( da hilft auch kein umschalten von ner Konstanten , hab ich so das Gefühl )
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...

Markus2

BeitragSa, Jan 17, 2004 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
junky hat Folgendes geschrieben:
... aber wenn man "nur" BB2D besitzt ...


Mode3D=0
und alle 3D Befehle zwischen If Mode3D=1 Then
rausnehmen oder auskommentieren dann gehts auch bei dir Wink
 

CodeMaster

BeitragSa, Jan 17, 2004 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Waaaaahoooooo! Mal eben so irgendwas mit 1200 Zeilen schreiben?
Sieht geil aus, nur rollen die Bälle wenn ich sie alle anklicke immer aus dem Bildschirm raus Smile Jedenfalls geiler Effekt!
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

TheShadow

Moderator

BeitragSo, Jan 18, 2004 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
wird da auch zentrifugalkraft eingerechnet? wenn sich ein ball dreht, dann muss es sich durch die masse nach ausßen bewegen...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Markus2

BeitragSo, Jan 18, 2004 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
TheShadow hat Folgendes geschrieben:
wird da auch zentrifugalkraft eingerechnet? wenn sich ein ball dreht, dann muss es sich durch die masse nach ausßen bewegen...



Ne,
dafür muß man noch ein Bezugsystem haben
und die Winkelgeschwindigkeit ausrechnen .
In dem Beispiel also kann ja jeder Ball um alle anderen rotieren .

a=-w²*r
Fz = m * w² * r
  • Zuletzt bearbeitet von Markus2 am Di, Jan 20, 2004 0:04, insgesamt einmal bearbeitet

Markus2

BeitragDi, Jan 20, 2004 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
habe mich mal schlau gemacht Embarassed

EDIT:
Ich glaube da muß die Coriolis-Kraft und die Zentrifugalkraft
eingebaut werden ... ???

... mehr Input ... Smile

D2006

Administrator

BeitragDi, Jan 20, 2004 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Coriolikraft ist was anderes. Spielt hier keine Rolle.

Zentrifugalkraft ist die Fliehkraft, sprich die Kraft die einen Körper in der Kreisbahn nach außen drückt.
Zentripedalkraft könnte man frei (also in diesem Beispiel) als Gravitation bezeichnen. Es ist also die Kraft, die einen Körper auf der Kreisbahn hält bzw. ihn nach ihnen zieht.

Zur Vollständigkeit:
Corioliskraft spielt auf der Erde eine Rolle. Am Äquator ist die Drehgeschwindikeit (in metern) höher als an den Polen. Dadurch driften Nordpolarwinde beispielsweise auf dem Weg zum Äquator nach Westen (?) ab. Oder auch nach Osten, weiß ich jetzt nicht so genau.

MfG

(In den hier zur Vefügung gestellten Informationen können durchaus Fehler enthalten sein.
Der Verfasser hat sie frei nach seinem Kopfwissen niedergeschrieben)

Markus2

BeitragDi, Jan 20, 2004 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@2006

Jo,

aber den gemeinsamen Schwerpunkt muß man berücksichtigen ,
da ich weiß noch nicht genau wie ich das umsetzen kann .
Weil alles soll sich erstmal aus dem Stillstand bewegen .

stfighter01

BeitragSa, Jan 31, 2004 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
cooles demo

aber ich glaub bei der anziehungskraft ist noch ein fehler enthalten.
(bitte sei nicht bös wenn ich blödsiinn quatsch)
soweit ich mitbekommen hab (laut deiner doku im programm)
bewegst du deine bälle immer in die richtung in die die meiste anziehungskraft herrscht.
du müsstet aber jeden ball zu jeden anderen ball hinbeschleunigen.
und zwar abhänging von distanz^2 und masse der bälle.

btw. rotation spielt hier keine rolle, es sein denn man berüksichtigt die reibung zwischen den bällen.

mfg stfighter
Denken hilft!

Markus2

BeitragSa, Jan 31, 2004 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@stfighter01

Ne , kann man so nicht sagen ,
ich habe für jeden Ball einen Richtungs Vector nur der ist unterschied
lich stark(lang) und am Ende habe ich einen Vector der übrig bleibt .
Was in dem Beispiel oben fehlt ist die Fliehkraft und der gemeinsame
Schwerpunkt , habs schon umgesetzt bin mit dem Ergebnis aber noch
nicht zu frieden .
Um was zu beschleunigen braucht man Kraft und die wird ja
schon ausgerechnet mit Masse und Entfernung zwischen den Bällen .
Diese Beschleunigung habe ich also zusammen gefaßt .
Wenn 5 Leute gleichzeitig an dir ziehen würden
mit unterschiedlichen kräften würdest du dich auch nur
in eine richtung bewegen mit der Kraft die übrig bleibt .
[/quote]

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group