7 self._sizeOffsets = numpy.array([3.0,3.0], numpy.float32)
8 self._machineSize = numpy.array([100,100,100], numpy.float32)
10 def setMachineSize(self, machineSize):
11 self._machineSize = machineSize
14 return self._objectList
17 self._findFreePositionFor(obj)
18 self._objectList.append(obj)
21 def remove(self, obj):
22 self._objectList.remove(obj)
26 while self._pushFree():
32 oldList = self._objectList
35 obj.setPosition(numpy.array([0,0], numpy.float32))
39 for a in self._objectList:
40 for b in self._objectList:
41 if not self._checkHit(a, b):
43 posDiff = a.getPosition() - b.getPosition()
44 if posDiff[0] == 0.0 and posDiff[1] == 0.0:
46 if abs(posDiff[0]) > abs(posDiff[1]):
50 aPos = a.getPosition()
51 bPos = b.getPosition()
52 center = (aPos[axis] + bPos[axis]) / 2
53 distance = (a.getSize()[axis] + b.getSize()[axis]) / 2 + 0.1 + self._sizeOffsets[axis] * 2
56 aPos[axis] = center + distance / 2
57 bPos[axis] = center - distance / 2
63 def _checkHit(self, a, b):
66 posDiff = a.getPosition() - b.getPosition()
67 if abs(posDiff[0]) < (a.getSize()[0] + b.getSize()[0]) / 2 + self._sizeOffsets[0] * 2 and abs(posDiff[1]) < (a.getSize()[1] + b.getSize()[1]) / 2 + self._sizeOffsets[1] * 2:
71 def checkPlatform(self, obj):
73 s = obj.getSize()[0:2] / 2 + self._sizeOffsets
74 if p[0] - s[0] < -self._machineSize[0] / 2:
76 if p[0] + s[0] > self._machineSize[0] / 2:
78 if p[1] - s[1] < -self._machineSize[1] / 2:
80 if p[1] + s[1] > self._machineSize[1] / 2:
84 def _findFreePositionFor(self, obj):
86 for a in self._objectList:
88 s = (a.getSize()[0:2] + obj.getSize()[0:2]) / 2 + self._sizeOffsets * 2
89 posList.append(p + s * ( 1, 1))
90 posList.append(p + s * ( 0, 1))
91 posList.append(p + s * (-1, 1))
92 posList.append(p + s * ( 1, 0))
93 posList.append(p + s * (-1, 0))
94 posList.append(p + s * ( 1,-1))
95 posList.append(p + s * ( 0,-1))
96 posList.append(p + s * (-1,-1))
103 for a in self._objectList:
104 if self._checkHit(a, obj):
109 dist = numpy.linalg.norm(p)
110 if not self.checkPlatform(obj):
112 if best is None or dist < bestDist:
116 obj.setPosition(best)