def generarAves(self, n: int, orden: float = 2): ancho = self.getAncho() * self.rango alto = self.getAlto() * self.rango maxX = self.getAncho() / 2 * self.rango maxY = self.getAlto() / 2 * self.rango for i in range(n): i = i # no me rompas las bolas pylint self.agregarParticula( Ave( ParOrdenado(np.random.rand() * ancho - maxX, np.random.rand() * alto - maxY), ParOrdenado((np.random.rand() * 2 * orden) - orden, (np.random.rand() * 2 * orden) - orden)))
def getFuerza(self, q) -> ParOrdenado: dist = q.distancia(self) if (dist > self.getRadio()): res = self.getVersor( q) * (8.987e9 * self.getCarga() * q.getCarga() / dist ** 2) elif (dist > 0): # placeholder de repulsion cercana res = self.getVersor(q) * abs(8.987e9 * self.getCarga() * q.getCarga()) else: res = ParOrdenado() return res
def promedio(self, aves: np.array) -> tuple: centro = ParOrdenado() promVel = ParOrdenado() repulsion = ParOrdenado() miPos = self.getPos() cont = 0 for ave in aves: dist = self.distancia(ave) if dist < Ave.getVision(): pos = ave.getPos() if dist < Ave.getCercania(): repulsion += miPos - pos centro += pos promVel += ave.getVel() cont += 1 if cont != 0: centro /= cont promVel /= cont else: centro = self.getPos() promVel = self.getVel() return centro, promVel, repulsion
def setVel(self, vel: ParOrdenado): modulo = vel.modulo() if (modulo > Ave.getMaxVel()): vel *= Ave.getMaxVel() / modulo super().setVel(vel)
def __init__(self, pos: ParOrdenado = ParOrdenado(), vel: ParOrdenado = ParOrdenado()): super().__init__(1, pos, vel) self.__tendencia = ParOrdenado()
def __init__(self, carga: float, masa: float, pos: ParOrdenado = ParOrdenado(), vel: ParOrdenado = ParOrdenado(), radio: float = 5e-6): super().__init__(masa, pos, vel) self.__carga = carga self.__radio = radio
def _fuerzaTotal(self, cargas, e, b) -> ParOrdenado: return ParOrdenado()
def _fuerzaCoulombQ(self, cargas: np.array) -> ParOrdenado: fuerza = ParOrdenado() for q in cargas: fuerza += q.getFuerza(self) return fuerza
class CargaInamovible(Carga): def _fuerzaTotal(self, cargas, e, b) -> ParOrdenado: return ParOrdenado() class EntornoCCampo(Entorno): def __init__(self, ancho: float, alto: float, size: float = 0.04, k: float = 0.9, e: ICampoVectorial = CampoNulo(), b: ICampoVectorial = CampoNulo()): super().__init__(ancho, alto, size, k) self.__e = e self.__b = b def step(self, dt: float): for q in self.getParticulas(): q.actualiza(self.getParticulas(), dt, self.__e, self.__b) self.correccion(q) entorno = EntornoCCampo(4, 4, k=0.8, b=CVConstante(0, 0, 1e-9)) entorno.rango = 0.8 # entorno.agregarParticula( # Carga(-1e-20, 2e-30, ParOrdenado(-0.5, 0), ParOrdenado(0, 0.3))) entorno.agregarParticula( Carga(-1e-20, 2e-30, ParOrdenado(0.5, 0), ParOrdenado(0, -0.3))) # entorno.agregarParticula( # Carga(-1e-20, 2e-30, ParOrdenado(0, -0.5), ParOrdenado(-0.3, 0))) entorno.agregarParticula( Carga(-1e-20, 2e-30, ParOrdenado(0, 0.5), ParOrdenado(0.3, 0))) # entorno.agregarParticula(CargaInamovible(1e-20, 1)) prueba = PuntosAnim() prueba.main(entorno)