def adjustVelocity(self): v1 = (self.normalVector-self.pos).normalized() v2 = (self.vel).normalized() try: angBw = math.acos(v1.dot(v2))*180/math.pi angBw = 0 if abs(angBw)<1 else angBw except: angBw = 180 if self.down else 0 ang = self.angle + 180 if angBw != 0 else self.angle ve= Vector(math.cos(0),math.sin(0))*self.vel.GetMagnitude() ve.rotate(Vector(0,0),ang) self.vel =ve
class DiffRootVector(Vector): ## ROOT IS A VECTOR def __init__(self,root,x,y,angle=0): super().__init__(x,y) self.root = root self.angle = math.degrees(math.atan((self.y)/self.x)) if self.x != 0 else 0 self.angle = self.angle if angle == 0 else angle self.origMag = self.GetMagnitude() self.mag = self.clampMagnitude() self.sumX = (self.root.x + self.x) self.sumY = (self.root.y + self.y) self.finPos = Vector(self.sumX,self.sumY) self.finPos = self.finPos.rotate(self.root,angle) if angle != 0 else self.finPos; self.angle = self.angle + 180 if (self.sumY > self.root.y and self.sumX < self.root.x) or (self.sumY-self.root.y <= 0 and self.root.x > self.sumX) else self.angle if self.x == 0: if self.sumY > self.root.y: self.angle = 90 else: self.angle = -90 self.arrowVertices = self.GetAVertices() def GetAVertices(self): dist = 5 x,y = self.root.x,self.root.y x1,y1 = x+self.x,y+self.y x2,y2 = x+(self.x-dist),y + self.y-dist x3,y3 = x+(self.x-dist),y + self.y+dist Vertices = [(Vector(x1,y1),Vector(x2,y2)),(Vector(x1,y1),Vector(x3,y3))] for i,(v1,v2) in enumerate(Vertices): nv1 = v1.rotate(self.finPos,self.angle) nv2 = v2.rotate(self.finPos,self.angle) Vertices[i] = (nv1,nv2) return Vertices def draw(self,screen): ## MAKE THE COLOR DEPENDENT ON THE VECTOR's length ## WOULD PROBABLY USE SOME SCALE FUCTION FOR DRAWING THE VECTOR #pygame.draw.line(screen,(self.r,0,self.b),(self.root.x,self.root.y),(self.sumX,self.sumY),2) pygame.draw.line(screen,(self.r,0,self.b),(self.root.x,self.root.y),(self.finPos.x,self.finPos.y),2) for v1,v2 in self.arrowVertices: pygame.draw.line(screen,(self.r,0,self.b),(v1.x,v1.y),(v2.x,v2.y),2) def clampMagnitude(self): maxMag = (w//2)/(scale) # maxMag = Vector(func1(w//scale,h//scale),func2(w//scale,h//scale)).GetMagnitude() mag = self.GetMagnitude()*(1+((scale-1)/100)) ratio = mag/maxMag ratio = min(1,ratio) self.r = 255*ratio self.b = 255*(1-ratio) new = self.SetMag(np.clip(mag,0,20)) self.x,self.y = new.x,new.y return new
# if keys[pygame.K_r]: # boid.pos = Vector(w//2,h//2) # if keys[pygame.K_w]: # print(pred) if pred == 0: dir += maxSpeed*Vector.up() boid.down = False # if keys[pygame.K_s]: elif pred == 1: dir += maxSpeed*Vector.down() boid.down = True if pred == 2: # if keys[pygame.K_a]: boid.UpdateAngle(-angleTurn) # if keys[pygame.K_d]: elif pred == 3: boid.UpdateAngle(angleTurn) ang = (boid.normalVector-boid.pos).heading() dir.rotate(Vector(0,0),ang+90) boid.applyForce(dir); if pop == []: torch.save(neat.population[neat.fitness.index(max(neat.fitness))].network, 'D:\\model_.pt') neat.population = neat.reproduce() pop = copy.copy(neat.population) setLandMarks(pop)