def plotArrow(self, time, factorLength = 40, factorWidth = 10, angleArrows = math.pi/4, color = (0, 255, 0)): startPos = self.currentPosition(time) endPos = startPos + self.velocity*factorLength width = numpy.linalg.norm(self.velocity)*factorWidth arrowUp = Numerical.pointAtAngle(endPos, math.pi + self.angle - angleArrows, width) arrowDown = Numerical.pointAtAngle(endPos, math.pi + self.angle + angleArrows, width) py.draw.aaline(self.surfaceToBlit, color, startPos, endPos) py.draw.aaline(self.surfaceToBlit, color, endPos, arrowUp) py.draw.aaline(self.surfaceToBlit, color, endPos, arrowDown)
def expectedTimeWalls(self, circle): # the order is East, West, North, South wallsHorizontal = [circle.radius, width - circle.radius] wallsVertical = [circle.radius, height - circle.radius] for horizontal in wallsHorizontal: solution = Numerical.solveLinear([circle.velocity[0], circle.currentPosition(self.time)[0] - horizontal]) yield solution + self.time for vertical in wallsVertical: solution = Numerical.solveLinear([circle.velocity[1], circle.currentPosition(self.time)[1] - vertical]) yield solution + self.time
def expectedTimeCircles(self, circleA, circleB): #TODO refactor this to work without self.time and move it as an unbound method to Circle class positionDifference = circleA.currentPosition(self.time) - circleB.currentPosition(self.time) velocityDifference = circleA.velocity - circleB.velocity radiiSum = circleA.radius + circleB.radius leadingCoefficient = velocityDifference[0]**2 + velocityDifference[1]**2 middleCoefficient = 2*(velocityDifference[0]*positionDifference[0] + velocityDifference[1]*positionDifference[1]) constantCoefficient = positionDifference[0]**2 + positionDifference[1]**2 - radiiSum**2 return Numerical.solveQuadraticPrune([leadingCoefficient, middleCoefficient, constantCoefficient]) + self.time