Menu

[r4657]: / trunk / py4science / examples / visual / shoot.py  Maximize  Restore  History

Download this file

90 lines (65 with data), 2.3 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
"""Visual Python demo: shooting a falling object.
Note that this script can NOT be run inside ipython via the 'run' command.
You MUST run it from the command line as a standalone program. Start by doing
chmod +x shoot.py
(or whatever you called it), and then you can run it via
./shoot.py
"""
import time
import sys
# Visual is built on top of the 'old' Numeric, so do NOT use numpy here. We
# do a wholesale import for coding convenience, this is highly discouraged in
# larger codebases (but usually OK in very small demo scripts and interactive
# use).
from Numeric import *
import visual as V
# Geometric parameters (all in MKS units)
theta = pi/4 # initial angle of gun
D = 20 # width ...
H = 20 # height of floor
g = -9.8 # gravity
gun_len = 2 # size of gun
arrow_len = 4 # and of arrow
v0_default = 15 # default for initial velocity if not given
# Numerical simulation parameters
dt = 0.01
# Update for all velocities under constant acceleration (gravity)
dv = V.vector(0,g*dt,0)
# Tolerance for deciding whether a collision happened
impact_distance = 0.5
# Initialize arguments
try:
v0 = float(sys.argv[1])
except:
v0 = v0_default
print 'Using default v0 =',v0,'m/s.'
# Build 3d world
# Define the line of sight
sight = V.vector(cos(theta),sin(theta),0)
# The floor is just a thin box
floor = V.box(pos=(D/2.,0,0), length=D, height=0.5, width=D, color=V.color.blue)
# Use a cone for our 'arrow'
arrow = V.cone(pos=(0,0,0), radius=0.9, axis=sight,color=V.color.red)
arrow.velocity = v0*sight
# The target is a sphere
target = V.sphere(pos=(D,H,0), radius=1, color=V.color.yellow)
target.velocity = V.vector(0,0,0)
# The 'dart gun' is just a cylinder.
gun = V.cylinder(pos=(0,0,0), axis=gun_len*sight, radius=1,
color = V.color.green)
# Run simulation
print 'Starting simulation...'
# Put a little delay to give all the OpenGL stuff time to initialize nicely.
time.sleep(1)
while (arrow.y >= 0 and target.y >=0) and \
V.mag(arrow.pos-target.pos) > impact_distance:
V.rate(75)
for obj in (arrow,target):
obj.pos += obj.velocity*dt
obj.velocity += dv
# Report to user.
if V.mag(arrow.pos-target.pos) <= impact_distance:
print 'Hit!'
else:
print 'Miss...'
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.