Accueil > > > COLLISIONS EN 3D AVEC VISUAL PYTHON
COLLISIONS EN 3D AVEC VISUAL PYTHON
Information sur la source
Description
Ce code fait suite à "COLLISIONS en cascades" déposé fin 2005 sur le site. Il met en oeuvre l'extension VISUAL de PYTHON, très intéressante pour les représentation graphiques en 3D.
Source
- #! /usr/bin/env python
- # -*- coding: Latin-1 -*-
-
- "COLLISIONS_VPYTHON"
- "Ce script est démarqué de l'exemple fourni dans 'GAS' de l'extension VISUAL de PYTHON"
-
- from visual import *
- from time import clock
- from visual.graph import *
- from random import random
- from visual.controls import*
-
- #################################################################################
-
- win=500
- # Valeurs typiques
- L=1.0
- gray=(0.7,0.7,0.7) # couleur des bordures
- Raxes=0.01 # rayon des bordures
- scene=display(title="COLLISIONS_VPYTHON",width=win,height=win,background=(0,1,1),x=0,y=0,range=L/4,center=(L/2.,L/2.,L/2.))
- scene.lights=[vector(1,1,1)]
- scene.ambient=0
- xaxis=curve(pos=[(0,0,0),(L,0,0)],color=gray,radius=Raxes)
- yaxis=curve(pos=[(0,0,0),(0,L,0)],color=gray,radius=Raxes)
- xaxis2=curve(pos=[(0,L,0),(L,L,0)],color=gray,radius=Raxes)
- yaxis2=curve(pos=[(L,0,0),(L,L,0)],color=gray,radius=Raxes)
- dt=0.002
-
- #################################################################################
-
- def boules():
- ""
- global pos,v,radius,boule,N,R,Nsteps,t,dt
- N =10 # valeur à modifier pour augmenter ou diminuer le nombre de boules
- R=0.05
- boule=[]
- colors=[color.red,color.green,color.blue,color.yellow,color.cyan,color.magenta,color.white]
- poslist,vlist,rlist=[],[],[]
- for i in range(N):
- Lmin=R
- Lmax=L-Lmin
- x,y,z,r=R+(Lmax-Lmin)*random(),R+(Lmax-Lmin)*random(),0,R
- boule=boule+[sphere(pos=(x,y,z),radius=r,color=colors[i % 7])]
- theta,phi=pi*random(),2*pi*random()
- vx,vy,vz=sin(theta)*cos(phi),sin(theta)*sin(phi),0
- poslist.append((x,y,z))
- vlist.append((vx,vy,vz))
- rlist.append(r)
- pos=array(poslist)
- v=array(vlist)
- radius=array(rlist)
- t=0.0
- Nsteps=0
- pos=pos+v*(dt/2.)
- time=clock()
-
- ################################################################################
-
- def move_boules():
- ""
- global pos,v,radius,boule,Nsteps,t,dt
- while 1:
- rate(100)
- pos =pos+ v*dt
- r = pos-pos[:,NewAxis]
- rmag = sqrt(add.reduce(r*r,-1))
- hit = less_equal(rmag,radius+radius[:,NewAxis])-identity(N)
- hitlist = sort(nonzero(hit.flat)).tolist()
- # si collisions:
- for ij in hitlist:
- i,j= divmod(ij,N)
- hitlist.remove(j*N+i)
- vtot=v[i]+v[j]
- vi,vj=v[i],v[j]
- ri,rj=boule[i].radius,boule[j].radius
- a=mag(vj-vi)**2
- if a==0: continue
- b=2*dot(pos[i]-pos[j],vj-vi)
- c=mag(pos[i]-pos[j])**2-(ri+rj)**2
- d=b**2-4.*a*c
- if d<0: continue
- deltat=(-b+sqrt(d))/(2.*a) # t-deltat lorsque il y a contact
- pos[i],pos[j]=pos[i]-v[i]*deltat,pos[j]-v[j]*deltat # retour à la configuration de contact
- vcmi,vcmj=v[i]-vtot/2,v[j]-vtot/2
- rrel=norm(pos[j]-pos[i])
- vcmi,vcmj=vcmi-2*dot(vcmi,rrel)*rrel,vcmj-2*dot(vcmj,rrel)*rrel
- v[i],v[j]=vcmi+vtot/2,vcmj+vtot/2
- pos[i],pos[j]=pos[i]+v[i]*deltat,pos[j]+v[j]*deltat
- # rebonds sur les bordures
- outside=less_equal(pos,R+Raxes)
- v1=v*outside
- v=v-v1+abs(v1)
- outside=greater_equal(pos,L-R-Raxes)
- v1=v*outside
- v=v-v1-abs(v1)
- # mise à jour des positions
- for i in range(N):
- boule[i].pos=pos[i]
- Nsteps=Nsteps+1
- t=t+dt
-
- def lancer():
- ""
- boules()
- move_boules()
- lancer()
-
#! /usr/bin/env python
# -*- coding: Latin-1 -*-
"COLLISIONS_VPYTHON"
"Ce script est démarqué de l'exemple fourni dans 'GAS' de l'extension VISUAL de PYTHON"
from visual import *
from time import clock
from visual.graph import *
from random import random
from visual.controls import*
#################################################################################
win=500
# Valeurs typiques
L=1.0
gray=(0.7,0.7,0.7) # couleur des bordures
Raxes=0.01 # rayon des bordures
scene=display(title="COLLISIONS_VPYTHON",width=win,height=win,background=(0,1,1),x=0,y=0,range=L/4,center=(L/2.,L/2.,L/2.))
scene.lights=[vector(1,1,1)]
scene.ambient=0
xaxis=curve(pos=[(0,0,0),(L,0,0)],color=gray,radius=Raxes)
yaxis=curve(pos=[(0,0,0),(0,L,0)],color=gray,radius=Raxes)
xaxis2=curve(pos=[(0,L,0),(L,L,0)],color=gray,radius=Raxes)
yaxis2=curve(pos=[(L,0,0),(L,L,0)],color=gray,radius=Raxes)
dt=0.002
#################################################################################
def boules():
""
global pos,v,radius,boule,N,R,Nsteps,t,dt
N =10 # valeur à modifier pour augmenter ou diminuer le nombre de boules
R=0.05
boule=[]
colors=[color.red,color.green,color.blue,color.yellow,color.cyan,color.magenta,color.white]
poslist,vlist,rlist=[],[],[]
for i in range(N):
Lmin=R
Lmax=L-Lmin
x,y,z,r=R+(Lmax-Lmin)*random(),R+(Lmax-Lmin)*random(),0,R
boule=boule+[sphere(pos=(x,y,z),radius=r,color=colors[i % 7])]
theta,phi=pi*random(),2*pi*random()
vx,vy,vz=sin(theta)*cos(phi),sin(theta)*sin(phi),0
poslist.append((x,y,z))
vlist.append((vx,vy,vz))
rlist.append(r)
pos=array(poslist)
v=array(vlist)
radius=array(rlist)
t=0.0
Nsteps=0
pos=pos+v*(dt/2.)
time=clock()
################################################################################
def move_boules():
""
global pos,v,radius,boule,Nsteps,t,dt
while 1:
rate(100)
pos =pos+ v*dt
r = pos-pos[:,NewAxis]
rmag = sqrt(add.reduce(r*r,-1))
hit = less_equal(rmag,radius+radius[:,NewAxis])-identity(N)
hitlist = sort(nonzero(hit.flat)).tolist()
# si collisions:
for ij in hitlist:
i,j= divmod(ij,N)
hitlist.remove(j*N+i)
vtot=v[i]+v[j]
vi,vj=v[i],v[j]
ri,rj=boule[i].radius,boule[j].radius
a=mag(vj-vi)**2
if a==0: continue
b=2*dot(pos[i]-pos[j],vj-vi)
c=mag(pos[i]-pos[j])**2-(ri+rj)**2
d=b**2-4.*a*c
if d<0: continue
deltat=(-b+sqrt(d))/(2.*a) # t-deltat lorsque il y a contact
pos[i],pos[j]=pos[i]-v[i]*deltat,pos[j]-v[j]*deltat # retour à la configuration de contact
vcmi,vcmj=v[i]-vtot/2,v[j]-vtot/2
rrel=norm(pos[j]-pos[i])
vcmi,vcmj=vcmi-2*dot(vcmi,rrel)*rrel,vcmj-2*dot(vcmj,rrel)*rrel
v[i],v[j]=vcmi+vtot/2,vcmj+vtot/2
pos[i],pos[j]=pos[i]+v[i]*deltat,pos[j]+v[j]*deltat
# rebonds sur les bordures
outside=less_equal(pos,R+Raxes)
v1=v*outside
v=v-v1+abs(v1)
outside=greater_equal(pos,L-R-Raxes)
v1=v*outside
v=v-v1-abs(v1)
# mise à jour des positions
for i in range(N):
boule[i].pos=pos[i]
Nsteps=Nsteps+1
t=t+dt
def lancer():
""
boules()
move_boules()
lancer()
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
CSDL FUNCTIONCSDL FUNCTION par Matthieu MEZIL
Dans mon post précédent , j'ai utilisé une CSDL Function afin de générer une requête SQL avec un DateDiff utilisant la date courante sur la BD à partir d'une requête LINQ. Dans le cadre de ce post , vous avez probablement remarqué que dans le cadre de plu...
Cliquez pour lire la suite de l'article par Matthieu MEZIL LINQ TO ENTITIESLINQ TO ENTITIES par Matthieu MEZIL
Cette semaine je suis à Montréal en tant que speaker sur Entity Framework pour l'évènement confoo . J'en profite pour remercier les organisateurs de cet évènement de m'avoir fait confiance et Access-IT de m'avoir permis d'y participer. En parallèle, j'ai ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL FAIRE APPARAITRE L'ONGLET 'DéVELOPPEUR' DANS OFFICE 2010FAIRE APPARAITRE L'ONGLET 'DéVELOPPEUR' DANS OFFICE 2010 par neodante
La nouvelle interface d'Office 2010 à amener quelques modifications par rapport à celle de 2007. Certes mineures, ces modifications ont fait disparaître la case à cocher de l'onglet 'Développeur' en première page du panneau du 'bouton Office' (dans Office...
Cliquez pour lire la suite de l'article par neodante [ASTUCE] PATCH POUR MICROSOFT FORUMS NNTP BRIDGE V1[ASTUCE] PATCH POUR MICROSOFT FORUMS NNTP BRIDGE V1 par pierre
Si vous avez téléchargé comme moi Microsoft Forums NNTP Bridge V1 avant le 11 mars 2010 (voir [Astuce] Disponibilité de Microsoft Forum NNTP Bridge Version 1.0), un problème de date localisée pour les non anglais était présent. Un patch est disponibl...
Cliquez pour lire la suite de l'article par pierre PB LORS DE L'INSTALLATION SHAREPOINT 2010.PB LORS DE L'INSTALLATION SHAREPOINT 2010. par Patrick Guimonet
Lors de l'installation de SharePoint 2010, j'ai rencontré un problème de plantage à l'étape 5 du configuration Wizard. Ca se termine sur cet écran : Et en analysant le fichier de journalisation, on remarque vers la fin des 15000 et quelques lign...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|