Beispiel #1
0
 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
Beispiel #3
0
 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
Beispiel #4
0
 def setVel(self, vel: ParOrdenado):
     modulo = vel.modulo()
     if (modulo > Ave.getMaxVel()):
         vel *= Ave.getMaxVel() / modulo
     super().setVel(vel)
Beispiel #5
0
 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)