【python 小白到精通】第五章:面向对象编程 - 三星运行模拟

简介: 前言这一章学习了面向对象编程,需要掌握的内容包括:会调用对象的方法和属性;如何编写类。这一章课程中有个模拟双星运行的小程序,为了增进理解,我改了改代码,成了模拟三星运行。

前言

这一章学习了面向对象编程,需要掌握的内容包括:会调用对象的方法和属性;如何编写类。

这一章课程中有个模拟双星运行的小程序,为了增进理解,我改了改代码,成了模拟三星运行

为什么使用面向对象

完成一些简单任务时,使用面向对象常常会需要写更多的代码,那我们为什么要使用面向对象呢?

由于面向对象的一些特性 (这里不细说),我们可以设计出低耦合的系统,更容易修改和维护

三星运行模拟

我们把星球作为对象,设计一个星球类,类中就包含了星球的一些性质。然后在主程序中调用星球的方法,让它自己的事情自己做。

模拟三星运行时遇到了一些问题,常常几个星球跑不了一会儿就飞开了。

8457167ee3bf4be6bd91b638a37e917b.gif

在多次调整参数后,它才终于可以多一起运行一会而,最终被我调成了类似恒星系的结构(有一个大质量的中心星球)。本来是想试试能不能出现三体那种效果的。

916745f1d25242849efc20e2e673f858.gif

定义星球类

import math
class Planet:
    Number = 0
    def __init__(self, color, mass, position, v_init):
        Planet.Number += 1
        self.color = color
        self.mass = mass
        self.x, self.y = position
        self.vx, self.vy = v_init
    def v_change(self, f, t=1e-3):
        fx, fy = f
        ax, ay = fx / self.mass, fy / self.mass
        self.vx += ax * t
        self.vy += ay * t
    def p_change(self, t=1e-3):
        self.x += self.vx * t
        self.y += self.vy * t
    def gravity(self, other_planet):
        distance = math.sqrt((self.x - other_planet.x) ** 2 + (self.y - other_planet.y) ** 2)
        f = self.mass * other_planet.mass / (distance ** 2)
        fx = (other_planet.x - self.x) / distance * f
        fy = (other_planet.y - self.y) / distance * f
        return fx, fy

主程序

import matplotlib.pyplot as plt
from matplotlib import animation
fig = plt.figure()
point_1 = Planet('r', 100, (-3, -3), (0, 0.3))
point_2 = Planet('r', 10, (5, -5), (0, -3))
point_3 = Planet('r', 0.1, (0, 10), (3, 0))
def animate(i):
    fig.clear()
    for _ in range(500):
        f_21 = point_1.gravity(point_2)
        f_31 = point_1.gravity(point_3)
        f_12 = point_2.gravity(point_1)
        f_32 = point_2.gravity(point_3)
        f_13 = point_3.gravity(point_1)
        f_23 = point_3.gravity(point_2)
        point_1.p_change()
        point_1.v_change(f_21)
        point_1.v_change(f_31)
        point_2.p_change()
        point_2.v_change(f_12)
        point_2.v_change(f_32)
        point_3.p_change()
        point_3.v_change(f_13)
        point_3.v_change(f_23)
    plt.scatter(point_1.x, point_1.y, c='r')  # 红色星球
    plt.scatter(point_2.x, point_2.y, c='b')  # 蓝色星球
    plt.scatter(point_3.x, point_3.y, c='g')  # 绿色星球
    plt.xlim(-20, 20)
    plt.ylim(-20, 20)
    plt.draw()
ani = animation.FuncAnimation(fig=fig, func=animate, frames=100, interval=1, blit=False)
plt.show()

相关文章
|
1月前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
80 15
|
1天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
16 5
|
29天前
|
开发者 Python
使用Python实现自动化邮件通知:当长时程序运行结束时
本文介绍了如何使用Python实现自动化邮件通知功能,当长时间运行的程序完成后自动发送邮件通知。主要内容包括:项目背景、设置SMTP服务、编写邮件发送函数、连接SMTP服务器、发送邮件及异常处理等步骤。通过这些步骤,可以有效提高工作效率,避免长时间等待程序结果。
59 9
|
2月前
|
Linux 区块链 Python
Python实用记录(十三):python脚本打包exe文件并运行
这篇文章介绍了如何使用PyInstaller将Python脚本打包成可执行文件(exe),并提供了详细的步骤和注意事项。
77 1
Python实用记录(十三):python脚本打包exe文件并运行
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
41 3
|
3月前
|
Python
turtle库的几个案例进阶,代码可直接运行(python经典编程案例)
该文章展示了使用Python的turtle库进行绘图的进阶案例,包括绘制彩色圆形和复杂图案的代码示例。
717 6
turtle库的几个案例进阶,代码可直接运行(python经典编程案例)
|
2月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
27 2
|
2月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
27 1
|
3月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
23 3
|
3月前
|
Python
turtle库的几个简单案例,代码可直接运行(python经典编程案例)
该文章提供了多个使用Python的turtle库绘制不同图形的简单示例代码,如画三角形、正方形、多边形等,展示了如何通过turtle进行基本的绘图操作。
318 5
下一篇
DataWorks