import pybullet as p import numpy as np # Configuration p.connect(p.GUI) # Mode graphique p.setGravity(0, 0, -9.81) tank_size = 1.0 # 1 mètre ball_radius = 0.0335 # 3.35 cm # Crée le réservoir (cube) tank = p.createCollisionShape(p.GEOM_BOX, halfExtents=[tank_size/2, tank_size/2, tank_size/2]) p.createMultiBody(baseCollisionShapeIndex=tank, basePosition=[0, 0, 0]) # Génère les balles num_balls = 0 for _ in range(4000): # On tente 4000 balles x = np.random.uniform(-tank_size/2 + ball_radius, tank_size/2 - ball_radius) y = np.random.uniform(-tank_size/2 + ball_radius, tank_size/2 - ball_radius) z = np.random.uniform(-tank_size/2 + ball_radius, tank_size/2 - ball_radius) ball = p.createCollisionShape(p.GEOM_SPHERE, radius=ball_radius) p.createMultiBody(baseCollisionShapeIndex=ball, basePosition=[x, y, z]) num_balls += 1 # Tasse pendant 10 secondes (simulation) for _ in range(1000): p.stepSimulation() # Compte les balles non superposées valid_balls = 0 for i in range(num_balls): overlapping = False pos_i = p.getBasePositionAndOrientation(i + 1)[0] # +1 car le réservoir est l'objet 0 for j in range(i): pos_j = p.getBasePositionAndOrientation(j + 1)[0] distance = np.linalg.norm(np.array(pos_i) - np.array(pos_j)) if distance < 2 * ball_radius: overlapping = True break if not overlapping: valid_balls += 1 print(f"Balles valides après tassement : {valid_balls}") p.disconnect()
by ahmedhussain18ahmedhussain18
by ahmedhussain18ahmedhussain18
raynroub created this project
9 months ago