Vor kurzem habe ich mich entschlossen, eine diskrete Kollisionssimulation von Grund auf neu zu schreiben, um Python zu lernen und persönlich zu genießen. Ich habe dieses Programm geschrieben, um ein Video zu erstellen, indem ich jedes Diagramm nach einem diskreten Zeit -Update als Bild in einem Ordner speichere und dann alle diese Bilder zusammenstellen (mit FFMPEG), was zu einem Video führt. Zuerst wollte ich sehen, was passieren würde, wenn ich einen Ball in einer Schachtel unter dem Einfluss der Schwerkraft simulierte. Ich weiß, wie die Antwort hätte aussehen sollen, ich habe als Kind mit Hüpfbällen gespielt. Wenn sich der Ball jedoch dem Ende des Bouncings nähert, wird er mit einer festgefahrenen Geschwindigkeit durch den Boden abgestoßen, anstatt auf dem Boden zur Ruhe zu kommen, und ich kann nicht für das Leben von mir herausfinden, warum. Sie kleben zusammen, anstatt abzupressen, ähnlich wie eine einzelne Kugel in den Boden haftet. < /P>
Dies ist der Code, den ich verwendet habe. Ich habe versucht, es so gut wie möglich zu kommentieren. Ich bin kein sehr kompetenter Codierer, daher entschuldige ich mich, wenn es herkömmliche Fehler gibt. Meine beste Vermutung ist, dass die Geschwindigkeit nach Kollision bei kleinen Zahlen nicht ausreicht, um das Teilchen auf den nächsten Rahmen herauszuholen, so dass sie immer wieder in der Wand gedreht wird und nie herauskommen kann. Ich habe versucht, die Geschwindigkeitsberechnung auf einen absoluten Wert zu ändern (da der Ball auf den Boden trifft, hat er eine negative Geschwindigkeit und wechselt dann auf positiv), aber der Ball wird weiterhin durch den Boden gehen, wenn er sich in Ruhe befinden soll. Der von mir verwendete Code ist unten sowie ein Discord -Link enthalten, der zum Video geht. Wo hat jemand einen Einblick?
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import math
import os
#Class defining a particle used in the simulation
class Particle:
def __init__(self, mass, position, velocity, acceleration):
self.mass = mass
self.radius = math.sqrt(self.mass/(math.pi*1.5))
self.position = position
self.velocity = velocity
self.acceleration = acceleration
self.KE = (1/2)*self.mass*np.dot(self.velocity,self.velocity)
self.left = position[0]-self.radius
self.right = position[0]+self.radius
self.top = position[1]+self.radius
self.bottom = position[1]-self.radius
#just defining the box that the simulation takes place in
class Box:
def __init__(self):
self.left = -10
self.right = 10
self.bottom = -10
self.top = 10
#Function that detects if there is a colision between the particle and the box
#This is where i think theres a [url=viewtopic.php?t=26065]problem[/url] but cant for the life of me figure out what it is
def handleBoxCollision():
#cor is the coefficient of restitution
cor = 0.8
if p.left = box.right:
p.velocity[0]=-cor*p.velocity[0]
if p.bottom = box.top:
p.velocity[1]=-cor*p.velocity[1]
#Since this is a discreet collision simulation this function is for updating the state of the simulation
def update(dt):
p.velocity = p.velocity+(p.acceleration*dt)
p.position = p.position+(p.velocity*dt)
p.left = p.position[0]-p.radius
p.right = p.position[0]+p.radius
p.top = p.position[1]+p.radius
p.bottom = p.position[1]-p.radius
handleBoxCollision()
#Because I run this simulation many times I first delete all the contents in my directory
#Then as simulation runs it saves each updated graph as a frame. Compile all frames into a video
#I took out the actual directory on my computer for privacy
dir = 'C:/PathToImageFile'
for f in os.listdir(dir):
os.remove(os.path.join(dir, f))
#Initial mass, position, velocity and acceleration
mass = 10
position = np.array([0,0])
velocity = np.array([5,0])
acceleration = np.array([0,-9.8])
#time step = 1/framerate
dt = 1/60
p = Particle(mass, position, velocity, acceleration)
box = Box()
#Run this loop for however many frames I want. In this case 600
for i in range(600):
figure, axes = plt.subplots()
update(dt)
#left of box
plt.plot([-10,-10],[-10,10],color='black')
#right of box
plt.plot([10,10],[-10,10],color='black')
#top of box
plt.plot([-10,10],[10,10],color='black')
#bottom of box
plt.plot([-10,10],[-10,-10],color='black')
cc = plt.Circle((p.position[0] ,p.position[1]), p.radius)
plt.scatter(p.position[0],p.position[1])
plt.xlim(-11,11)
plt.ylim(-11,11)
plt.text(-10,-10.7,"time="+str(i*dt))
plt.text(-10,10.3,"velocity="+str(p.velocity[1]))
axes=plt.gca()
axes.add_artist(cc)
axes.set_aspect(1)
figure.savefig('/PathToImageFile'+str(i)+'.png')
plt.close('all')
Vor kurzem habe ich mich entschlossen, eine diskrete Kollisionssimulation von Grund auf neu zu schreiben, um Python zu lernen und persönlich zu genießen. Ich habe dieses Programm geschrieben, um ein Video zu erstellen, indem ich jedes Diagramm nach einem diskreten Zeit -Update als Bild in einem Ordner speichere und dann alle diese Bilder zusammenstellen (mit FFMPEG), was zu einem Video führt. Zuerst wollte ich sehen, was passieren würde, wenn ich einen Ball in einer Schachtel unter dem Einfluss der Schwerkraft simulierte. Ich weiß, wie die Antwort hätte aussehen sollen, ich habe als Kind mit Hüpfbällen gespielt. Wenn sich der Ball jedoch dem Ende des Bouncings nähert, wird er mit einer festgefahrenen Geschwindigkeit durch den Boden abgestoßen, anstatt auf dem Boden zur Ruhe zu kommen, und ich kann nicht für das Leben von mir herausfinden, warum. Sie kleben zusammen, anstatt abzupressen, ähnlich wie eine einzelne Kugel in den Boden haftet. < /P> Dies ist der Code, den ich verwendet habe. Ich habe versucht, es so gut wie möglich zu kommentieren. Ich bin kein sehr kompetenter Codierer, daher entschuldige ich mich, wenn es herkömmliche Fehler gibt. Meine beste Vermutung ist, dass die Geschwindigkeit nach Kollision bei kleinen Zahlen nicht ausreicht, um das Teilchen auf den nächsten Rahmen herauszuholen, so dass sie immer wieder in der Wand gedreht wird und nie herauskommen kann. Ich habe versucht, die Geschwindigkeitsberechnung auf einen absoluten Wert zu ändern (da der Ball auf den Boden trifft, hat er eine negative Geschwindigkeit und wechselt dann auf positiv), aber der Ball wird weiterhin durch den Boden gehen, wenn er sich in Ruhe befinden soll. Der von mir verwendete Code ist unten sowie ein Discord -Link enthalten, der zum Video geht. Wo hat jemand einen Einblick?[code]import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm import math import os
#Class defining a particle used in the simulation class Particle: def __init__(self, mass, position, velocity, acceleration):
self.mass = mass self.radius = math.sqrt(self.mass/(math.pi*1.5)) self.position = position self.velocity = velocity self.acceleration = acceleration self.KE = (1/2)*self.mass*np.dot(self.velocity,self.velocity)
#just defining the box that the simulation takes place in class Box: def __init__(self): self.left = -10 self.right = 10 self.bottom = -10 self.top = 10
#Function that detects if there is a colision between the particle and the box #This is where i think theres a [url=viewtopic.php?t=26065]problem[/url] but cant for the life of me figure out what it is def handleBoxCollision(): #cor is the coefficient of restitution cor = 0.8 if p.left = box.right: p.velocity[0]=-cor*p.velocity[0]
if p.bottom = box.top: p.velocity[1]=-cor*p.velocity[1]
#Since this is a discreet collision simulation this function is for updating the state of the simulation def update(dt): p.velocity = p.velocity+(p.acceleration*dt) p.position = p.position+(p.velocity*dt) p.left = p.position[0]-p.radius p.right = p.position[0]+p.radius p.top = p.position[1]+p.radius p.bottom = p.position[1]-p.radius
handleBoxCollision()
#Because I run this simulation many times I first delete all the contents in my directory #Then as simulation runs it saves each updated graph as a frame. Compile all frames into a video #I took out the actual directory on my computer for privacy dir = 'C:/PathToImageFile' for f in os.listdir(dir): os.remove(os.path.join(dir, f))
#Initial mass, position, velocity and acceleration mass = 10 position = np.array([0,0]) velocity = np.array([5,0]) acceleration = np.array([0,-9.8])
#time step = 1/framerate dt = 1/60
p = Particle(mass, position, velocity, acceleration) box = Box()
#Run this loop for however many frames I want. In this case 600 for i in range(600): figure, axes = plt.subplots()
update(dt)
#left of box plt.plot([-10,-10],[-10,10],color='black') #right of box plt.plot([10,10],[-10,10],color='black') #top of box plt.plot([-10,10],[10,10],color='black') #bottom of box plt.plot([-10,10],[-10,-10],color='black')
cc = plt.Circle((p.position[0] ,p.position[1]), p.radius)
In den Diagrammen wie man den Abstand zwischen dem unteren Etikett und dem Boden wie zwischen den anderen Etiketten entspricht. Das erste Bild ist das, was ich habe, das zweite ist, wie es sein...
Wir haben eine Anwendung auf Winui3, Android und iOS. Es verwendet mvvmcross als Plattform zum Verwalten der ViewModels. Die spezifische Situation lautet wie folgt:
Ich entwickle eine Winkelanwendung, die Benutzer in einer REST -API registriert. Das Problem ist, dass ich nach dem Aufrufen der API eine 200 (OK) Antwort mit scheinbar gültigen Daten erhalte, aber...
Ich erstelle eine Lebensmittelkarte in Swiftui, aber ich habe ein Problem mit der Elementpositionierung. Ich brauche den unteren HStack (mit Kalorien und einem Herzsymbol), um mit dem Boden der Karte...