美文网首页Python 文库
turtle - turtledemo - planet_and

turtle - turtledemo - planet_and

作者: 巭牛猫 | 来源:发表于2021-03-06 17:01 被阅读0次
    【 模 拟 地 月 绕 日 运 行 轨 迹 】
    #!/usr/bin/env python3
    """       turtle-example-suite:
    
            tdemo_planets_and_moon.py
    
    Gravitational system simulation using the
    approximation method from Feynman-lectures,
    p.9-8, using turtlegraphics.
    
    Example: heavy central body, light planet,
    very light moon!
    Planet has a circular orbit, moon a stable
    orbit around the planet.
    
    You can hold the movement temporarily by
    pressing the left mouse button with the
    mouse over the scrollbar of the canvas.
    
    """
    from turtle import Shape, Turtle, mainloop, Vec2D as Vec
    
    G = 8
    
    class GravSys(object):
        def __init__(self):
            self.planets = []
            self.t = 0
            self.dt = 0.01
        def init(self):
            for p in self.planets:
                p.init()
        def start(self):
            for i in range(10000):
                self.t += self.dt
                for p in self.planets:
                    p.step()
    
    class Star(Turtle):
        def __init__(self, m, x, v, gravSys, shape):
            Turtle.__init__(self, shape=shape)
            self.penup()
            self.m = m
            self.setpos(x)
            self.v = v
            gravSys.planets.append(self)
            self.gravSys = gravSys
            self.resizemode("user")
            self.pendown()
        def init(self):
            dt = self.gravSys.dt
            self.a = self.acc()
            self.v = self.v + 0.5*dt*self.a
        def acc(self):
            a = Vec(0,0)
            for planet in self.gravSys.planets:
                if planet != self:
                    v = planet.pos()-self.pos()
                    a += (G*planet.m/abs(v)**3)*v
            return a
        def step(self):
            dt = self.gravSys.dt
            self.setpos(self.pos() + dt*self.v)
            if self.gravSys.planets.index(self) != 0:
                self.setheading(self.towards(self.gravSys.planets[0]))
            self.a = self.acc()
            self.v = self.v + dt*self.a
    
    ## create compound yellow/blue turtleshape for planets
    
    def main():
        s = Turtle()
        s.reset()
        s.getscreen().tracer(0,0)
        s.ht()
        s.pu()
        s.fd(6)
        s.lt(90)
        s.begin_poly()
        s.circle(6, 180)
        s.end_poly()
        m1 = s.get_poly()
        s.begin_poly()
        s.circle(6,180)
        s.end_poly()
        m2 = s.get_poly()
    
        planetshape = Shape("compound")
        planetshape.addcomponent(m1,"orange")
        planetshape.addcomponent(m2,"blue")
        s.getscreen().register_shape("planet", planetshape)
        s.getscreen().tracer(1,0)
    
        ## setup gravitational system
        gs = GravSys()
        sun = Star(1000000, Vec(0,0), Vec(0,-2.5), gs, "circle")
        sun.color("yellow")
        sun.shapesize(1.8)
        sun.pu()
        earth = Star(12500, Vec(210,0), Vec(0,195), gs, "planet")
        earth.pencolor("green")
        earth.shapesize(0.8)
        moon = Star(1, Vec(220,0), Vec(0,295), gs, "planet")
        moon.pencolor("blue")
        moon.shapesize(0.5)
        gs.init()
        gs.start()
        return "Done!"
    
    if __name__ == '__main__':
        main()
        mainloop()
    

    内容来源:官方文库
    牛猫名言:最好的资料就是官方文档


    本文链接:https://www.jianshu.com/p/5f4567dcc3f2
    转载请注明,谢谢!
    编辑:牛猫大侠


    相关文章

      网友评论

        本文标题:turtle - turtledemo - planet_and

        本文链接:https://www.haomeiwen.com/subject/tlksqltx.html