7 self._sizeOffsets = numpy.array([3.0,3.0], numpy.float32)
8 self._machineSize = numpy.array([100,100,100], numpy.float32)
9 self._headOffsets = numpy.array([18.0,18.0], numpy.float32)
11 def setMachineSize(self, machineSize):
12 self._machineSize = machineSize
15 return self._objectList
18 self._findFreePositionFor(obj)
19 self._objectList.append(obj)
22 def remove(self, obj):
23 self._objectList.remove(obj)
27 while self._pushFree():
33 oldList = self._objectList
36 obj.setPosition(numpy.array([0,0], numpy.float32))
40 minPos = numpy.array([9999999,9999999], numpy.float32)
41 maxPos = numpy.array([-9999999,-9999999], numpy.float32)
42 for obj in self._objectList:
43 pos = obj.getPosition()
45 minPos[0] = min(minPos[0], pos[0] - size[0] / 2)
46 minPos[1] = min(minPos[1], pos[1] - size[1] / 2)
47 maxPos[0] = max(maxPos[0], pos[0] + size[0] / 2)
48 maxPos[1] = max(maxPos[1], pos[1] + size[1] / 2)
49 offset = -(maxPos + minPos) / 2
50 for obj in self._objectList:
51 obj.setPosition(obj.getPosition() + offset)
54 for a in self._objectList:
55 for b in self._objectList:
56 if not self._checkHit(a, b):
58 posDiff = a.getPosition() - b.getPosition()
59 if posDiff[0] == 0.0 and posDiff[1] == 0.0:
61 if abs(posDiff[0]) > abs(posDiff[1]):
65 aPos = a.getPosition()
66 bPos = b.getPosition()
67 center = (aPos[axis] + bPos[axis]) / 2
68 distance = (a.getSize()[axis] + b.getSize()[axis]) / 2 + 0.1 + self._sizeOffsets[axis] + self._headOffsets[axis]
71 aPos[axis] = center + distance / 2
72 bPos[axis] = center - distance / 2
78 def _checkHit(self, a, b):
81 posDiff = a.getPosition() - b.getPosition()
82 if abs(posDiff[0]) < (a.getSize()[0] + b.getSize()[0]) / 2 + self._sizeOffsets[0] + self._headOffsets[0]:
83 if abs(posDiff[1]) < (a.getSize()[1] + b.getSize()[1]) / 2 + self._sizeOffsets[1] + self._headOffsets[1]:
87 def checkPlatform(self, obj):
89 s = obj.getSize()[0:2] / 2 + self._sizeOffsets
90 if p[0] - s[0] < -self._machineSize[0] / 2:
92 if p[0] + s[0] > self._machineSize[0] / 2:
94 if p[1] - s[1] < -self._machineSize[1] / 2:
96 if p[1] + s[1] > self._machineSize[1] / 2:
100 def _findFreePositionFor(self, obj):
102 for a in self._objectList:
104 s = (a.getSize()[0:2] + obj.getSize()[0:2]) / 2 + self._sizeOffsets + self._headOffsets
105 posList.append(p + s * ( 1, 1))
106 posList.append(p + s * ( 0, 1))
107 posList.append(p + s * (-1, 1))
108 posList.append(p + s * ( 1, 0))
109 posList.append(p + s * (-1, 0))
110 posList.append(p + s * ( 1,-1))
111 posList.append(p + s * ( 0,-1))
112 posList.append(p + s * (-1,-1))
119 for a in self._objectList:
120 if self._checkHit(a, obj):
125 dist = numpy.linalg.norm(p)
126 if not self.checkPlatform(obj):
128 if best is None or dist < bestDist:
132 obj.setPosition(best)