Simulazioni di Fisica

carlo232
In questi giorni ho scritto un programma che simula il comportamento di tre masse vincolate tra loro da forze di tipo elastico. Se volete scaricarlo potete farlo in http://digilander.libero.it/hendrix33/

Aspetto i vostri mai banali giudizi

Ciao! :D

Risposte
GIOVANNI IL CHIMICO
Bello, visto che la dinamica è 3D, perchè non prevedere l'urto elastico anche con la parete anteriore e posteriore?

carlo232
"GIOVANNI IL CHIMICO":
Bello, visto che la dinamica è 3D, perchè non prevedere l'urto elastico anche con la parete anteriore e posteriore?


Beh, le cose si complicherebbero alquanto...

giuseppe87x
Interessante...

spassky
L'hai fatto in visual basic ?

Che algoritmo hai implemetato ?
Quali equazioni ci stanno sotto? Mi piacerebbe capire un po' meglio : mi ha sempre appassionato la modellizzazione di fenomeni fisici..

carlo232
"spassky":
L'hai fatto in visual basic ?

Che algoritmo hai implemetato ?
Quali equazioni ci stanno sotto? Mi piacerebbe capire un po' meglio : mi ha sempre appassionato la modellizzazione di fenomeni fisici..


Si con VB, il funzionamento è il seguente:

C'è un timer che genera eventi ogni millesimo di secondo.

Alle palline sono abbinati le componenti del loro vettore velocità

A ogni evento le componenti del vettore velocità sono modificate in base alla accelerazione prevista.

Le palline sono spostate e il timer genera un altro evento.

Posto il codice ma così com'è è difficile da capire

carlo232
Dim Vx, Vy, Vx2, Vy2, Vx3, Vy3 As Single
Dim Insert1, Insert2, Insert3 As Boolean
Dim Vector1, Vector2, Vector3, Play, Pause As Boolean
Dim k1, k2, k3 As Single

Private Sub Command1_Click()
If Pause = True Then
Timer1.Enabled = True
Pause = False
Shape1.Visible = True
Shape2.Visible = True
Shape3.Visible = True
Command3.Enabled = True
GoTo fine
End If


If Play = True Then
Timer1.Enabled = True
Vx = (-Line4.X1 + Line4.X2) / 100
Vy = (-Line4.Y1 + Line4.Y2) / 100
Vx2 = (-Line5.X1 + Line5.X2) / 100
Vy2 = (-Line5.Y1 + Line5.Y2) / 100
Vx3 = (-Line6.X1 + Line6.X2) / 100
Vy3 = (-Line6.Y1 + Line6.Y2) / 100
Line4.Visible = False
Line5.Visible = False
Line6.Visible = False
Shape1.Visible = True
Shape2.Visible = True
Shape3.Visible = True
Play = False
End If
Text1.Enabled = False
Text2.Enabled = False
Text3.Enabled = False
fine:
End Sub

Private Sub Command2_Click()
If Timer1.Enabled = True And Pause = False Then
Command3.Enabled = False
Timer1.Enabled = False
Pause = True
End If
End Sub

Private Sub Command3_Click()
Timer1.Enabled = False
Picture1.Cls
Shape1.Visible = False
Shape2.Visible = False
Shape3.Visible = False
Text1.Enabled = True
Text2.Enabled = True
Text3.Enabled = True
Insert1 = True
End Sub

Private Sub Form_Load()
Insert1 = True
k1 = 10
k2 = 10
k3 = 10

End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)


If Insert1 = True Then
Line1.X1 = X
Line1.Y1 = Y
Line3.X1 = X
Line3.Y1 = Y
End If

If Vector1 = True Then
Line4.Visible = True
Line4.X2 = X
Line4.Y2 = Y
LabelX = (-Line4.X1 + Line4.X2) / 100
LabelY = (-Line4.Y1 + Line4.Y2) / 100
End If

If Insert2 = True Then
Line1.X2 = X
Line1.Y2 = Y
Line2.X1 = X
Line2.Y1 = Y
End If

If Vector2 = True Then
Line5.Visible = True
Line5.X2 = X
Line5.Y2 = Y
LabelX = (-Line5.X1 + Line5.X2) / 100
LabelY = (-Line5.Y1 + Line5.Y2) / 100
End If

If Insert3 = True Then
Line2.X2 = X
Line2.Y2 = Y
Line3.X2 = X
Line3.Y2 = Y
End If

If Vector3 = True Then
Line6.Visible = True
Line6.X2 = X
Line6.Y2 = Y
LabelX = (-Line6.X1 + Line6.X2) / 100
LabelY = (-Line6.Y1 + Line6.Y2) / 100
End If

End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Vector3 = True Then
Insert3 = False
Vector1 = False
Vector2 = False
Vector3 = False
Play = True
End If


If Insert3 = True And Button = 1 Then
Insert3 = False
Line6.X1 = Line3.X2
Line6.Y1 = Line3.Y2
Vector3 = True
End If


If Vector2 = True And Button = 1 Then
Vector2 = False
Insert3 = True
End If

If Insert2 = True And Button = 1 Then
Insert2 = False
Line5.X1 = Line1.X2
Line5.Y1 = Line1.Y2
Vector2 = True
End If

If Vector1 = True And Button = 1 Then
Vector1 = False
Insert2 = True
End If

If Insert1 = True And Button = 1 Then
Insert1 = False
Line4.X1 = Line1.X1
Line4.Y1 = Line1.Y1
Vector1 = True
End If



End Sub


Private Sub Text1_Change()
k1 = Text1.Text
End Sub

Private Sub Text2_Change()
k2 = Text2.Text
End Sub

Private Sub Text3_Change()
k3 = Text3.Text
End Sub

Private Sub Timer1_Timer()
Static ax1, ay1, ax2, ay2, ax3, ay3 As Integer



Line1.X1 = Line1.X1 + Vx
Line1.Y1 = Line1.Y1 + Vy
Line3.X1 = Line1.X1
Line3.Y1 = Line1.Y1
Shape1.Left = Line1.X1 - 127
Shape1.Top = Line1.Y1 - 127
Line1.X2 = Line1.X2 + Vx2
Line1.Y2 = Line1.Y2 + Vy2
Line2.X1 = Line1.X2
Line2.Y1 = Line1.Y2
Shape2.Left = Line1.X2 - 127
Shape2.Top = Line1.Y2 - 127
Line2.X2 = Line2.X2 + Vx3
Line2.Y2 = Line2.Y2 + Vy3
Line3.X2 = Line2.X2
Line3.Y2 = Line2.Y2
Shape3.Left = Line2.X2 - 127
Shape3.Top = Line2.Y2 - 127
Picture1.ForeColor = vbGreen
Picture1.PSet (Line1.X1, Line1.Y1)
Picture1.ForeColor = vbRed
Picture1.PSet (Line2.X1, Line2.Y1)
Picture1.ForeColor = vbBlue
Picture1.PSet (Line3.X2, Line3.Y2)

Vx = Vx + k1 * (-Line1.X1 + Line1.X2) / 10000 + k3 * (-Line1.X1 + Line3.X2) / 10000
Vy = Vy + k1 * (-Line1.Y1 + Line1.Y2) / 10000 + k3 * (-Line1.Y1 + Line3.Y2) / 10000
Vx2 = Vx2 + k1 * (Line1.X1 - Line1.X2) / 10000 + k2 * (-Line2.X1 + Line2.X2) / 10000
Vy2 = Vy2 + k1 * (Line1.Y1 - Line1.Y2) / 10000 + k2 * (-Line2.Y1 + Line2.Y2) / 10000
Vx3 = Vx3 + k2 * (Line2.X1 - Line2.X2) / 10000 + k3 * (Line3.X1 - Line3.X2) / 10000
Vy3 = Vy3 + k2 * (Line2.Y1 - Line2.Y2) / 10000 + k3 * (Line3.Y1 - Line3.Y2) / 10000


If Line1.X1 < 0 Then
Line1.X1 = 0
Vx = -Vx
End If
If Line1.X1 > 15000 Then
Line1.X1 = 15000
Vx = -Vx
End If

If Line1.Y1 < 0 Then
Line1.Y1 = 0
Vy = -Vy
End If
If Line1.Y1 > 10000 Then
Line1.Y1 = 10000
Vy = -Vy
End If

If Line1.X2 < 0 Then
Line1.X2 = 0
Vx2 = -Vx2
End If
If Line1.X2 > 15000 Then
Line1.X2 = 15000
Vx2 = -Vx2
End If

If Line1.Y2 < 0 Then
Line1.Y2 = 0
Vy2 = -Vy2
End If
If Line1.Y2 > 10000 Then
Line1.Y2 = 10000
Vy2 = -Vy2
End If

If Line2.X2 < 0 Then
Line2.X2 = 0
Vx3 = -Vx3
End If
If Line2.X2 > 15000 Then
Line2.X2 = 15000
Vx3 = -Vx3
End If

If Line2.Y2 < 0 Then
Line2.Y2 = 0
Vy3 = -Vy3
End If
If Line2.Y2 > 10000 Then
Line2.Y2 = 10000
Vy3 = -Vy3
End If


End Sub

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.