Ejemplo n.º 1
0
 def boundarycompute(self):
     try:
         return self.boundary
     except:
         if self[0].str2[6:9] != 'GLY':
             atoms = self.findatoms(["  N  ","  C  ","  CA ","  O  ","  OT1", "  CB "])
         else:
             atoms = self.findatoms(["  N  ","  C  ","  CA ","  O  ","  OT1", "  HA2"])
         atoms.remove(0)
         posterm = vector.Nlocation(atoms[1].coords(),atoms[2].coords(),atoms[3].coords())
         axis = vector.translate(vector.minus(atoms[0].coords()))(posterm)
         N1 = vector.unit(axis)
         length = vector.norm(axis)
         N2 = vector.unit(vector.translate(vector.minus(atoms[2].coords()))(atoms[4].coords()))
         self.boundary = [atoms[0].coords(), N1, N2, length]
         return self.boundary
Ejemplo n.º 2
0
def object_collision(sprite1, sprite2):
    normal = [sprite1.origin[0] - sprite2.origin[0], sprite1.origin[1] - sprite2.origin[1]]
    unit_normal = vector.unit(normal)

    unit_tangent = [-unit_normal[1], unit_normal[0]]
    neg_unit_normal = vector.times(-1, unit_normal)

    sprite1.pos = vector.plus(sprite1.pos, unit_normal)
    sprite1.set_position(sprite1.pos)

    sprite2.pos = vector.plus(sprite2.pos, neg_unit_normal)
    sprite2.set_position(sprite2.pos)

    v1n = vector.dotp(unit_normal, sprite1.speed)

    v1t = vector.dotp(unit_tangent, sprite1.speed)

    v2n = vector.dotp(unit_normal, sprite2.speed)

    v2t = vector.dotp(unit_tangent, sprite2.speed)

    u1n = (v1n * (sprite1.mass - sprite2.mass) + 2 * sprite2.mass * v2n) / (sprite1.mass + sprite2.mass)

    u2n = (v2n * (sprite2.mass - sprite1.mass) + 2 * sprite1.mass * v1n) / (sprite1.mass + sprite2.mass)

    sprite1_tangent = vector.times(v1t, unit_tangent)
    sprite1_normal = vector.times(u1n, unit_normal)

    sprite2_tangent = vector.times(v2t, unit_tangent)
    sprite2_normal = vector.times(u2n, unit_normal)

    sprite1.speed = vector.plus(sprite1_tangent, sprite1_normal)
    sprite2.speed = vector.plus(sprite2_tangent, sprite2_normal)
Ejemplo n.º 3
0
 def __init__(self, terrain):
     pos = terrain.start.origin
     tiles = terrain.surrounding_tiles(terrain.start, multiplier=2)
     for tile in tiles:
         if tile.color == colors['road']:
             direction = vector.unit(
                 vector.distance(tile.pos, terrain.start.pos))
     super().__init__(pos, 1, direction, 10, 20, colors['blue'])
Ejemplo n.º 4
0
 def d(t):
     currentPoint = Wmap.ev(0)[0]
     currentLocationOnRnew = Rnew.projectOntoAxis(currentPoint)
     for x in pointsOnWmap:
         thisLocationOnRnew = Rnew.projectOntoAxis(x)
         if thisLocationOnRnew >= currentLocationOnRnew:
             if thisLocationOnRnew <= t:
                  currentLocationOnRnew = thisLocationOnRnew
                  currentPoint = x
     return vector.vectorToAngle(vector.unit(vector.translate(vector.minus(Rnew.ev(currentLocationOnRnew)[0]))(currentPoint)))
Ejemplo n.º 5
0
def circleArc(center, start, end):
    radToStart = vector.translate(vector.minus(center))(start)
    radToEnd = vector.translate(vector.minus(center))(end)
    radiusSquared = vector.norm(radToStart)*vector.norm(radToEnd)
    radius = math.sqrt(radiusSquared)
    
    innerProductValue = vector.innerproduct(radToStart, radToEnd)
    angle = math.acos(innerProductValue/radiusSquared)
    
    firstUnitRadial = vector.unit(radToStart)
    secondUnitRadial = vector.unit(vector.translate(vector.scale(radToStart,-innerProductValue/radiusSquared))(radToEnd))
    
    def CN(t):
        point = vector.translate(center)(vector.translate(vector.scale(firstUnitRadial,radius*math.cos(t/radius)))(vector.scale(secondUnitRadial,radius*math.sin(t/radius))))
        tangent = vector.translate(vector.scale(firstUnitRadial,-math.sin(t/radius)))(vector.scale(secondUnitRadial,math.cos(t/radius)))
        output = [point,tangent]
        #output.append([math.cos(t/radius),math.sin(t/radius),0])
        return output

    return TwistingAxis(angle*radius,CN)
Ejemplo n.º 6
0
 def boundarycompute(self):
     try:
         return self.boundary
     except:
         if self[0].str2[6:9] != 'GLY':
             atoms = self.findatoms(
                 ["  N  ", "  C  ", "  CA ", "  O  ", "  OT1", "  CB "])
         else:
             atoms = self.findatoms(
                 ["  N  ", "  C  ", "  CA ", "  O  ", "  OT1", "  HA2"])
         atoms.remove(0)
         posterm = vector.Nlocation(atoms[1].coords(), atoms[2].coords(),
                                    atoms[3].coords())
         axis = vector.translate(vector.minus(atoms[0].coords()))(posterm)
         N1 = vector.unit(axis)
         length = vector.norm(axis)
         N2 = vector.unit(
             vector.translate(vector.minus(atoms[2].coords()))(
                 atoms[4].coords()))
         self.boundary = [atoms[0].coords(), N1, N2, length]
         return self.boundary
Ejemplo n.º 7
0
 def bounce2(self, p2):
     """ More complicated bounce, should give better angles.
     Takes in the particle it is bouncing against and updates its speed too """
     
     avgSpeed = vector.scale(vector.absAdd(self.speed, p2.speed), 0.5) # Average speed
     # Find the normalised vector from p1 to p2
     n = vector.unit(vector.subtract(self.position, p2.position))
     
     self.speed = vector.multiply(n, avgSpeed)
     p2.speed = vector.scale(vector.multiply(n, avgSpeed), -1)
     
     self.limitSpeed()
     p2.limitSpeed()
Ejemplo n.º 8
0
def segment(start, end):
    startToEnd = vector.translate(vector.minus(start))(end)
    distance = vector.norm(startToEnd)
    try:
        tng = vector.unit(startToEnd)
        def CN(t):
            output = [vector.translate(start)(vector.scale(tng,t)),tng]
            #output.append(normal)
            return output
    except:
        def CN(t):
            output = [start, [0,0,0]]  
    
    return TwistingAxis(distance, CN)
Ejemplo n.º 9
0
    def bounce2(self, p2):
        """ More complicated bounce, should give better angles.
        Takes in the particle it is bouncing against and updates its speed too """

        avgSpeed = vector.scale(vector.absAdd(self.speed, p2.speed),
                                0.5)  # Average speed
        # Find the normalised vector from p1 to p2
        n = vector.unit(vector.subtract(self.position, p2.position))

        self.speed = vector.multiply(n, avgSpeed)
        p2.speed = vector.scale(vector.multiply(n, avgSpeed), -1)

        self.limitSpeed()
        p2.limitSpeed()
Ejemplo n.º 10
0
def smoothedPieceWiseLinearFullFunctionality(points, mapFromSpaceToTime, Wnew, smoothingFactor = 0.33):
    if len(points) < 2:
        print("Error: only " + str(len(points)) + " points supplied to smoothedPieceWiseLinear")
        return
    
    currentPoints = copy.deepcopy(points)
    numPoints = len(currentPoints)
    
    attachElements = [cutSegment(points[0],points[1],0,smoothingFactor)]
    
    for i in range(0,numPoints - 2):
        lastToPivot = vector.translate(vector.minus(points[i]))(points[i+1])
        pivotToNext = vector.translate(vector.minus(points[i+1]))(points[i+2])
        angle = vector.innerproduct(lastToPivot, pivotToNext)/(vector.norm(lastToPivot)*vector.norm(pivotToNext))
        collinear = (abs(angle) < 0.001)
        if collinear:
            attachElements.append(cutSegment(points[i],points[i+1],smoothingFactor,1))
            attachElements.append(cutSegment(points[i+1],points[i+2],1,smoothingFactor))
        else:
            attachElements.append(cutSegment(points[i],points[i+1],smoothingFactor,1-smoothingFactor))
            attachElements.append(circleArcAroundPivotClosestPieces(points[i+1],points[i],points[i+2],smoothingFactor))
    
    attachElements.append(cutSegment(points[-2],points[-1],smoothingFactor,1))
    
    def iteratedAttach(start, end):
        if start < end:
            midpoint = (start + end)/2
            iteratedAttach(start, midpoint)
            iteratedAttach(midpoint + 1, end)
            attachElements[start].attachPartial(1, attachElements[midpoint + 1])
    iteratedAttach(0, len(attachElements)-1)
    Wmap = attachElements[0]
    
    produceN2 = lambda x : vector.unit(vector.orthogonalComponent(vector.translate(vector.minus(Wnew.ev(mapFromSpaceToTime(x[0]))[0]))(x[0]),x[1]))
    appendN2 = lambda x: [x[0],x[1],produceN2(x)]
    Wmap.CN = compose(appendN2,Wmap.CN)
    
    return [Wmap, Wnew, lambda t: mapFromSpaceToTime(Wmap.ev(t)[0])]
Ejemplo n.º 11
0
 def findActualEndPoint(vec):
     unitVec = vector.unit(vec)
     return vector.translate(pivot)(vector.scale(vector.unit(vec),smallerNorm*smoothingFactor))
Ejemplo n.º 12
0
 def grab(self):
     mouse = pygame.mouse.get_pos()
     #if self.rect.collidepoint(mouse):
     direction_vector = [mouse[0] - self.origin[0], mouse[1] - self.origin[1]]
     unit_direction = vector.unit(direction_vector)
     self.speed = vector.plus(self.speed, unit_direction)