Menu

[r8989]: / trunk / py4science / examples / visual / shoot_t.py  Maximize  Restore  History

Download this file

102 lines (75 with data), 2.7 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
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
#!/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).
import numpy as N
import math
from enthought.tvtk.tools import visual as V
def mag(v):
"Return the magnitude of a vector"
return math.sqrt((v*v).sum())
# Geometric parameters (all in MKS units)
theta = math.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(math.cos(theta),math.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)
floor = V.box(pos=(D/2.,0,0), length=D, height=0.5, width=D)
# Use a cone for our 'arrow'
#arrow = V.cone(pos=(0,0,0), radius=0.9, axis=sight,color=V.color.red)
arrow = V.cone(pos=(0,0,0), radius=0.9, axis=sight)
arrow.velocity = v0*sight
# The target is a sphere
#target = V.sphere(pos=(D,H,0), radius=1, color=V.color.yellow)
target = V.sphere(pos=(D,H,0), radius=1)
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 \
mag(arrow.pos-target.pos) > impact_distance:
#V.rate(75)
for obj in (arrow,target):
# obj.pos += obj.velocity*dt
obj.pos = obj.pos + obj.velocity*dt
#obj.velocity += dv
obj.velocity = obj.velocity + dv
# Report to user.
if 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.