File: pygi_collisions.v_sim.py

package info (click to toggle)
v-sim 3.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 15,860 kB
  • sloc: ansic: 75,222; sh: 10,239; makefile: 580; python: 572; cpp: 353; xml: 130
file content (54 lines) | stat: -rwxr-xr-x 1,711 bytes parent folder | download
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
#!/usr/bin/env python

from gi.repository import v_sim
import cProfile

render = v_sim.uiMainClass_getDefaultRendering()
data = render.getVisuData()

# Example with integrated iterators (still an issue with the
# stop criterion)
rad = {}
for it in data.__iterElements__():
  rad[it.element.name] = v_sim.renderingAtomic_getRadius(it.element)
#print "Radii: ", rad

def hit((x1,y1,z1), r1, (x2,y2,z2), r2):
  return ( (x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2 < (r1 + r2)**2 )

# With Python iterators.
collision = set()

def byPairs(data, collision):
  for (it1, it2) in data.__iterByPairs__():
    if hit(data.getNodeCoordinates(it1.node), rad[it1.element.name], \
           data.getNodeCoordinates(it2.node), rad[it2.element.name]):
      collision.add(int(it1.node.number))
      collision.add(int(it2.node.number))

def doubleLoop(data, collision):
  for it1 in data:
    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.add(int(it1.node.number))
        collision.add(int(it2.node.number))

def byCopy(data, collision):
  nodes = data.getAllNodePositions()
  for (c1, i1, e1) in nodes:
    for (c2, i2, e2) in nodes:
      if i1 > i2 and hit(c1, rad[e1], c2, rad[e2]):
        collision.add(int(i1))
        collision.add(int(i2))

cProfile.run('doubleLoop(data, collision)')
cProfile.run('byPairs(data, collision)')
cProfile.run('byCopy(data, collision)')

marks = render.getMarks()
if marks.setHighlightedList(tuple(collision), v_sim.MarksStatus.SET):
  v_sim.object_redraw(None)

v_sim.uiMainClass_getCurrentPanel().quit(True)