File: pygi_collisions.py

package info (click to toggle)
v-sim 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,188 kB
  • sloc: ansic: 115,451; f90: 19,861; python: 2,120; makefile: 1,002; xml: 719; cpp: 688; sh: 23
file content (67 lines) | stat: -rw-r--r-- 1,976 bytes parent folder | download | duplicates (2)
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
#!/usr/bin/env python
from gi.repository import v_sim

# Load the file to test.
data = v_sim.Data.new()
data.addFile("collisions.ascii",0,None)
v_sim.visuBasicLoad_dataFromFile(data,None,0)

# Parse the configuration files.
v_sim.visuBasicParse_configFiles()
# Or read only the given file.
#v_sim.visuConfigFileLoad(v_sim.CONFIGFILE_RESOURCE, "v_sim.res", data)


# Example of loop to create a dictionnary associating element name and radius.
rad = {}
dataIter = data.iterNew()
data.iterStart(dataIter)
while (dataIter.element != None):
  rad[dataIter.element.name] = v_sim.renderingAtomicGet_radius(dataIter.element)
  data.iterNextElement(dataIter)

# Example with integrated iterators (still an issue with the
# stop criterion)
try:
  for it in data.__iterElements__():
    rad[it.element.name] = v_sim.renderingAtomicGet_radius(it.element)
except RuntimeError:
  pass
print "Radii: ", rad


def hit(c1, r1, c2, r2):
  return ( (c1.x-c2.x)**2 + (c1.y-c2.y)**2 + (c1.z-c2.z)**2 < (r1 + r2) ** 2 )

# With Python iterators.
##collision = []
##try:
##  for it1 in data:
##    try:
##      for it2 in data:
##        if it1.node.number > it2.node.number and \
##	     hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
##		 data.getNodeCoordinates(it2.node), rad[it2.element.name]):
##	  collision.append((int(it1.node.number), int(it2.node.number)))
##    except RuntimeError:
##      pass
##except RuntimeError:
##  pass
##print collision

# With V_Sim iterators
print "Collision detection..."
collision = []
it1 = data.iterNew()
it2 = data.iterNew()
data.iterStart(it1)
while (it1.node is not None):
  data.iterStart(it2)
  while (it2.node is not None):
    if it1.node.number > it2.node.number and \
	 hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
	     data.getNodeCoordinates(it2.node), rad[it2.element.name]):
      collision.append((int(it1.node.number), int(it2.node.number)))
    data.iterNext(it2)
  data.iterNext(it1)
print collision