示例#1
0
 def localVelocity(self):
     """
     Return the velocity as (horizontal, vertical) in the local frame
     of reference.
     """
     horizon = self.horizonVector()
     up = vector(-horizon[1], horizon[0])
     return vector(self.v.dot(horizon), self.v.dot(up))
示例#2
0
 def __init__(self, planet, thrust, Isp, mass, v = None, altitude = 0, deltaT = 0.03):
     self.t = 0
     self.p = vector(0, planet.radius + altitude)
     if v is None:
         self.v = vector(planet.siderealSpeed(altitude), 0)
     else:
         self.v = vector(*v)
     self.deltaT = deltaT
     self.mass = mass
     self.initialMass = mass
     self.thrust = thrust
     self.Ve = Isp * g0
     self.planet = planet
示例#3
0
    def forces(self, flightPitch, AoA, v, altitude = 0, jetoptions = jets.kerbonormative, throttle = 1, verbose = False):
        """
        Given:
        the flight path pitch (the angle of prograde with the surface),
        the angle of attack (the angle of pitch with prograde),
        the speed,
        the altitude and the planet,
        the throttle (default max we can achieve at this altitude)

        Prints a report if 'verbose' is set.

        Returns a tuple:
            (net, throttle, lift, drag, thrust, apparentGravity)
        net, lift, drag, and thrust are vectors with X being forward and Y being up.
        throttle is, from 0 to 1, how much the jet engines will be throttled up assuming proper intake layout
        apparentGravity is the force of gravity minus centrifugal effects.  Normally negative.
        """
        drag = physics.vector(0,0)
        lift = physics.vector(0,0)
        down = 0
        maxthrust = physics.vector(0,0)
        airProvided = 0
        airRequired = 0
        for part in self._parts:
            (d,l,g) = part.zeroThrustForces(flightPitch, AoA, v, altitude, jetoptions.planet)
            drag = drag.add(d)
            lift = lift.add(l)
            down += g
            maxthrust = maxthrust.add(part.thrustForceAtMaxThrottle(v, flightPitch, AoA))
            airProvided += part.airProvided(AoA, v, altitude, jetoptions)
            airRequired += part.airRequired(v, altitude, jetoptions)

        # account for throttle setting due to air
        if throttle * airRequired > airProvided:
            throttle = airProvided / airRequired
        thrust = maxthrust.scale(throttle)

        net = thrust.add(lift.add(drag.add(physics.vector(0, down))))

        if verbose:
            print ("throttle: %.1f%%" % (throttle * 100))
            print ("lift:    (%7.2f, %7.2f) kN" % (lift[0], lift[1]))
            print ("drag:    (%7.2f, %7.2f) kN" % (drag[0], drag[1]))
            print ("thrust:  (%7.2f, %7.2f) kN" % (thrust[0], thrust[1]))
            print ("gravity: (       , %7.2f) kN" % down)
            print ("net:     (%7.2f, %7.2f) kN" % (net[0], net[1]))

        return (net, throttle, lift, drag, thrust, down)
示例#4
0
 def gravityVector(self):
     """
     Return the gravity vector in global coordinates.
     """
     horizon = self.horizonVector()
     down = vector(horizon[1], -horizon[0])
     g = self.planet.gravity(self.altitude())
     return down.scale(g)
示例#5
0
    def thrustForceAtMaxThrottle(self, v, flightPitchDegrees, AoAdegrees):
        if isinstance(self._parttype, jets.jetengine):
            t = self._parttype.thrust(v)
        elif isinstance(self._parttype, engine.engine):
            t = self._parttype.thrust
        else:
            t = 0

        enginePitchRad = math.radians(flightPitchDegrees + AoAdegrees + self._AoA)
        return physics.vector(math.cos(enginePitchRad) * t, math.sin(enginePitchRad) * t)
示例#6
0
def objUpdate():
    # Gravity
    force1 = vector(0, -1) * 10 * obj.mass
    obj.addForce(force1)
    # Circular
    force2 = (obj.pos - center).normalized() * obj.mass * (abs(
        obj.v)**2) / abs(obj.pos - center)
    obj.addForce(force2)
    # Tension
    force3 = -(force2 + force2.normalized() * (force2.normalized() * force1))
    obj.addForce(force3)
    obj.update(1 / FPS)
    print(obj.pos - center)
示例#7
0
class ang_object:
    pos1 = vector(0, 0)
    pos2 = vector(0, 1)
    I = 1
    alpha = 0
    omega = 0
    angle = 0
    center = vector(0, 0)
    force = [vector(0, 0), vector(0, 0)]
    torque = 0

    def update(self, timeInterval: int):
        self.torque = 0
        self.alpha = 0
        for Force in self.force:
            self.torque += (Force[0] - self.center) @ Force[1]
        self.alpha = self.torque / self.I
        self.omega += self.alpha * timeInterval
        self.angle = self.omega * timeInterval
        self.pos1 = (self.pos1 - self.center).rotated(
            self.angle * math.pi / 180) + self.center
        self.pos2 = (self.pos2 - self.center).rotated(
            self.angle * math.pi / 180) + self.center
示例#8
0
def objUpdate():
    spring.startPos = pane.pos1
    spring2.startPos = pane.pos2

    spring.endPos = obj.pos
    kx = (abs(spring.startPos - spring.endPos) - spring.length) * spring.k

    spring2.endPos = obj2.pos
    kx2 = (abs(spring2.startPos - spring2.endPos) - spring2.length) * spring2.k

    obj.force = (spring.startPos - spring.endPos).normalized() * kx
    obj2.force = (spring2.startPos - spring2.endPos).normalized() * kx2

    SF = []
    SF.append([pane.pos1, -obj.force])
    SF.append([pane.pos2, -obj2.force])
    pane.force = SF

    obj.force += vector(0, -obj.mass * 10)
    obj2.force += vector(0, -obj2.mass * 10)

    obj.update(1 / FPS)
    obj2.update(1 / FPS)
    pane.update(1 / FPS)
示例#9
0
    def zeroThrustForces(self, flightPitchDegrees, AoADegrees, v, altitude, planet):
        """
        Return the forces other than thrust that this part produces.
        Returns a tuple (drag, lift, apparentGravity) with quantities in kN.
        Lift and drag are vectors; gravity is a number (just the y coordinate, positive means up).
        """
        Cd = self._staticCd
        Clift = 0
        if isinstance(self._parttype, lift.wing):
            Cd = self._parttype.dragCoeff(self._AoA + AoADegrees)
            Clift = self._parttype.liftCoeff(self._AoA + AoADegrees)
        elif isinstance(self._parttype, jets.intake):
            Cd = self._parttype.dragCoeff(self._AoA + AoADegrees)
        elif isinstance(self._parttype, jets.jetengine):
            Cd = 0.2
        elif isinstance(self._parttype, engine.engine):
            Cd = 0.2

        dragMagnitude = planet.dragForce(altitude, v, self.mass(), Cd)
        liftMagnitude = v * planet.pressure(altitude) * Clift

        flightPitchRad = math.radians(flightPitchDegrees)
        cosPitch = math.cos(flightPitchRad)
        sinPitch = math.sin(flightPitchRad)

        horizontalSpeedSrf = v * cosPitch
        horizontalSpeedOrb = horizontalSpeedSrf + planet.siderealSpeed(altitude)
        vOrbit = planet.orbitalVelocity(altitude)
        centrifuge = horizontalSpeedOrb * horizontalSpeedOrb / (vOrbit * vOrbit)
        gravity = planet.gravity(altitude)
        downForceMagnitude = self.mass() * (centrifuge - gravity)

        dragVector = physics.vector(-cosPitch * dragMagnitude, -sinPitch * dragMagnitude)
        liftVector = physics.vector(-sinPitch * liftMagnitude, cosPitch * liftMagnitude)

        return (dragVector, liftVector, downForceMagnitude)
示例#10
0
 def horizonVector(self):
     angle = self.horizonAngle()
     return vector(math.cos(angle), math.sin(angle))
示例#11
0
CLOCK = 0
plot = []

### ONLY EDIT THIS AREA ############


class springObj:
    startPos = vector(0, 0)
    endPos = vector(0, 1)
    length = 1
    k = 1


obj = object()
obj.mass = 200
obj.pos = vector(WIDTH / 2, HEIGHT / 2 + 50)

spring = springObj()
spring.startPos = vector(WIDTH / 2, HEIGHT / 2 + 150)
spring.endPos = obj.pos
spring.length = 150
spring.k = 16

obj2 = object()
obj2.mass = 200
obj2.pos = vector(WIDTH / 2, HEIGHT / 2 - 200)

spring2 = springObj()
spring2.startPos = obj.pos
spring2.endPos = obj2.pos
spring2.length = 150
示例#12
0
def objUpdate():
    obj.force = vector(0, 0)
    obj.update(1 / FPS)
示例#13
0
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
FPS = 100
ACCEL = 100
WIDTH = 800
HEIGHT = 600
CLOCK = 0
plot = []
G = 1

### ONLY EDIT THIS AREA ############
obj = object()
obj.pos = vector(WIDTH / 2, HEIGHT / 2)

obj2 = object()

obj.mass = 1000
obj2.mass = 10

init = (G * obj.mass / 200)**0.5

init *= 1

obj2.v = vector(init, 0)
obj2.pos = vector(WIDTH / 2, HEIGHT / 2 + 200)

center = vector(WIDTH / 2, HEIGHT / 2)
示例#14
0
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
FPS = 100
ACCEL = 10
WIDTH = 800
HEIGHT = 600
CLOCK = 0
plot = []

### ONLY EDIT THIS AREA ############

obj = object()
obj.v = vector(15, 0)
obj.pos = vector(WIDTH / 2, HEIGHT / 2 - 200)

obj2 = object()
obj2.v = vector(-15, 0)
obj2.pos = vector(WIDTH / 2, HEIGHT / 2 + 200)

center = vector(WIDTH / 2, HEIGHT / 2)


def objUpdate():
    obj.force = obj.v.norm().normalized() * (obj.mass * (abs(obj.v)**2) / 200)
    obj2.force = obj2.v.norm().normalized() * (obj2.mass *
                                               (abs(obj2.v)**2) / 200)
    obj.update(1 / FPS)
    obj2.update(1 / FPS)
示例#15
0
HEIGHT = 600
CLOCK = 0
plot = []

### ONLY EDIT THIS AREA ############


class springObj:
    startPos = vector(0, 0)
    endPos = vector(0, 1)
    length = 1
    k = 1


obj = object()
obj.pos = vector(WIDTH / 2, HEIGHT / 2 - 190)

spring = springObj()
spring.startPos = vector(WIDTH / 2, HEIGHT / 2 + 150)
spring.endPos = obj.pos
spring.length = 240
spring.k = 1


def objUpdate():
    spring.endPos = obj.pos
    kx = (abs(spring.startPos - spring.endPos) - spring.length) * spring.k
    obj.force = (spring.startPos - spring.endPos).normalized() * kx
    print(obj.force)
    obj.update(1 / FPS)
示例#16
0
 def _polarToCartesian(r, theta):
     return vector(r * math.cos(theta), r * math.sin(theta))
示例#17
0
ACCEL = 5
WIDTH = 800
HEIGHT = 600
CLOCK = 0
plot = []

### ONLY EDIT THIS AREA ############

class springObj:
    startPos = vector(0,0)
    endPos = vector(0,1)
    length = 1
    k = 1

obj = object()
obj.v = vector(0,0.00000001)
obj.pos = vector(WIDTH/2, HEIGHT/2-190)

spring = springObj()
spring.startPos = vector(WIDTH/2, HEIGHT/2+150)
spring.endPos = obj.pos
spring.length = 240
spring.k = 1


def objUpdate():
    spring.endPos = obj.pos
    kx = (abs(spring.startPos - spring.endPos) - spring.length) * spring.k
    obj.force = (spring.startPos - spring.endPos).normalized() * kx - abs(obj.v)*obj.v.normalized() * 0.1
    print(obj.force)
    obj.update(1/FPS)
示例#18
0
    def update(self, timeInterval: int):
        self.torque = 0
        self.alpha = 0
        for Force in self.force:
            self.torque += (Force[0] - self.center) @ Force[1]
        self.alpha = self.torque / self.I
        self.omega += self.alpha * timeInterval
        self.angle = self.omega * timeInterval
        self.pos1 = (self.pos1 - self.center).rotated(
            self.angle * math.pi / 180) + self.center
        self.pos2 = (self.pos2 - self.center).rotated(
            self.angle * math.pi / 180) + self.center


obj = object()
obj.pos = vector(WIDTH / 2 - 200, HEIGHT / 2 - 95)
obj.mass = 10

obj2 = object()
obj2.pos = vector(WIDTH / 2 + 200, HEIGHT / 2 - 250)
obj2.mass = 10

spring = springObj()
spring.startPos = vector(WIDTH / 2 - 200, HEIGHT / 2 + 150)
spring.endPos = obj.pos
spring.length = 240
spring.k = 20

spring2 = springObj()
spring2.startPos = vector(WIDTH / 2 + 200, HEIGHT / 2 + 150)
spring2.endPos = obj2.pos
示例#19
0
class springObj:
    startPos = vector(0, 0)
    endPos = vector(0, 1)
    length = 1
    k = 1
示例#20
0
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
FPS = 100
ACCEL = 10
WIDTH = 800
HEIGHT = 600
CLOCK = 0
plot = []

### ONLY EDIT THIS AREA ############

obj = object()
obj.v = vector(10**-20, 10**-20)
obj.pos = vector(WIDTH / 2 - 130, HEIGHT / 2 - 100)

center = vector(WIDTH / 2, HEIGHT / 2 + 200)


def objUpdate():
    # Gravity
    force1 = vector(0, -1) * 10 * obj.mass
    obj.addForce(force1)
    # Circular
    force2 = (obj.pos - center).normalized() * obj.mass * (abs(
        obj.v)**2) / abs(obj.pos - center)
    obj.addForce(force2)
    # Tension
    force3 = -(force2 + force2.normalized() * (force2.normalized() * force1))