def _applyCore(self, object, ctx): # Отделяем часть массы КА if not self._separated: ctx.log.info( 'Объект {0} - отделение ступени {1} массой {2}'.format( object.name, self._name, Formatter.mass(self._mass))) self._separated = True object.mass = object.mass - self._mass
def print(self, screen): """Вывод записи в консоль""" color = 'WHITE'; if self._level == SolverLogLevel.err: color = 'LRED' else: if self._level == SolverLogLevel.trace: color = 'DGRAY' screen.set_color(fg = terminal.colors[color]) print ('{0}: {1}'.format(Formatter.time(self._time), self._message))
def print(self, screen): """Вывод записи в консоль""" color = 'WHITE' if self._level == SolverLogLevel.err: color = 'LRED' else: if self._level == SolverLogLevel.trace: color = 'DGRAY' screen.set_color(fg=terminal.colors[color]) print('{0}: {1}'.format(Formatter.time(self._time), self._message))
def _applyCore(self, object, ctx): # Отделяем часть массы КА if not self._separated: ctx.log.info( "Объект {0} - отделение ступени {1} массой {2}".format( object.name, self._name, Formatter.mass(self._mass) ) ) self._separated = True object.mass = object.mass - self._mass
def _runStep(self): """Выполнить шаг расчета""" for objA in self._objects: for objB in self._objects: # 1. Объект не влияет сам на себя # 2. Объект должен быть подвержен действию сил (втч сил гравитации) # Напр. объект, столкнувшийся с другим, более не подвержен действию внешних сил if objA != objB and objA.controller.isAffectedByForces: rVector = objB.position - objA.position distance = rVector.length # расчет коллизий - меньший по массе объект может столкнуться с большим по массе if objA.mass < objB.mass and distance <= objA.radius + objB.radius: # Объект A столкнулся с объектом B CollidedSpaceObjectController(objB, -rVector).attach(objA) objA.beginStep(self._ctx) relativeVelocity = (objA.velocity - objB.velocity).length self._log.err( self._ctx.t, 'Объект {0} столкнулся с объектом {1}, скорость столкновения {2}' .format(objA.name, objB.name, Formatter.speed(relativeVelocity))) continue # расчет гравитации if distance > 0: g = G * objA.mass * objB.mass h = 1. / distance**3 force = rVector * g * h self._log.trace( self._ctx.t, 'Грав. сила для объекта {0} = {1} | {2}'.format( objA.name, force, force * (1. / objA.mass))) self._log.trace( self._ctx.t, 'Сила тяги для объекта {0} = {1} | {2}'.format( objA.name, objA.force, objA.force * (1. / objA.mass))) objA.force = objA.force + force
def _runStep(self): """Выполнить шаг расчета""" for objA in self._objects: for objB in self._objects: # 1. Объект не влияет сам на себя # 2. Объект должен быть подвержен действию сил (втч сил гравитации) # Напр. объект, столкнувшийся с другим, более не подвержен действию внешних сил if objA != objB and objA.controller.isAffectedByForces: rVector = objB.position - objA.position distance = rVector.length # расчет коллизий - меньший по массе объект может столкнуться с большим по массе if objA.mass < objB.mass and distance <= objA.radius + objB.radius: # Объект A столкнулся с объектом B CollidedSpaceObjectController(objB, -rVector).attach(objA) objA.beginStep(self._ctx) relativeVelocity = (objA.velocity - objB.velocity).length self._log.err(self._ctx.t, 'Объект {0} столкнулся с объектом {1}, скорость столкновения {2}'.format(objA.name, objB.name, Formatter.speed(relativeVelocity))) continue # расчет гравитации if distance > 0: g = G * objA.mass * objB.mass h = 1. / distance**3 force = rVector * g * h self._log.trace(self._ctx.t, 'Грав. сила для объекта {0} = {1} | {2}'.format(objA.name, force, force * (1. / objA.mass))) self._log.trace(self._ctx.t, 'Сила тяги для объекта {0} = {1} | {2}'.format(objA.name, objA.force, objA.force * (1. / objA.mass))) objA.force = objA.force + force
def _onStart(self, object, ctx): ctx.log.info('Объект {0} - двигатель включен, тяга {1}'.format( object.name, Formatter.force(self._force.length))) return
def _onStart(self, object, ctx): ctx.log.info( "Объект {0} - двигатель включен, тяга {1}".format(object.name, Formatter.force(self._force.length)) ) return