import turtle
class Phy:
'''
逻辑:创建点→以下循环→计算力→计算加速度→计算速度→计算位置
'''
def __init__(self, m, v, p, r=None, color="black", e=0):
'''
创建一个点
:param m: float 质量大小,取正数
:param v: list[x,y,z] x,y,z为float 速度,矢量
:param p: list[x,y,z] x,y,z为float 位置
:param color: str or tuple(r,g,b) 点的颜色
:param r: float 点的半径
:param e: float 电荷
a: list[x,y,z] 加速度,矢量
'''
self.m = m
self.v = v
self.p = p
self.a = [0, 0, 0]
if r is None:
r = m ** 0.3
self.r = r
self.axianshi = self.a
self.color = color
self.e=e
Phy.biao.append(self)
biao = [] # 这个表里记录了所有被创建的点,计算时会遍历它
def __str__(self):
return f"m={self.m},v={self.v},p={self.p},a={self.axianshi}"
def force(self, li):
'''
对某点施力
:param li: list[x,y,z] x,y,z为float 力,矢量
:return: None 直接修改a,无返回
'''
self.a[0] += li[0] / self.m
self.a[1] += li[1] / self.m
self.a[2] += li[2] / self.m
def force2(self, lisize, p):
'''
对某点施力,不同的是,这里只需要提供力的大小和对象位置
:param lisize: float 力的大小
:param p: list[x,y,z] 力的方向
:return: None 直接修改a,无返回
'''
mdx = [p[0] - self.p[0], p[1] - self.p[1], p[2] - self.p[2]]
odx = ((p[0] - self.p[0]) ** 2 + (p[1] - self.p[1]) ** 2 + (p[2] - self.p[2]) ** 2) ** 0.5
li = [lisize * mdx[0] / odx, lisize * mdx[1] / odx, lisize * mdx[2] / odx]
self.force(li)
def resilience(self, x=None, k=100, other=None, string=False):
'''
对某两个点施以弹力
:param x: float 弹簧原长 None 默认当前长度为原长
:param k: float 劲度系数
:param other: Phy 弹簧的另一个点
:param string: bool 弹力模型为线型(True)或杆型(False)
:return: None 直接修改a,无返回
'''
if x is None and (not ((self, other) in Phy.rbook.keys())):
Phy.rbook[(self, other)] = ((other.p[0] - self.p[0]) ** 2 + (other.p[1] - self.p[1]) ** 2 + (
other.p[2] - self.p[2]) ** 2) ** 0.5
x = Phy.rbook[(self, other)]
elif x is None:
x = Phy.rbook[(self, other)]
dx = ((other.p[0] - self.p[0]) ** 2 + (other.p[1] - self.p[1]) ** 2 + (other.p[2] - self.p[2]) ** 2) ** 0.5 - x
if dx<0 and string is True:
lisize=0
else:
lisize = dx * k
self.force2(lisize, other.p)
other.force2(lisize, self.p)
if not((self, other) in Phy.rbiao):
Phy.rbiao.append((self, other))
rbook = {} # 用来储存弹簧的长度,向x填入None时用
rbiao = [] # 用来储存需要连成弹簧的点,显示用,显示后要清空!
@classmethod
def rread(cls,biao):
'''
将弹力列表中的内容转为弹力
:param biao: [{"self":Phy, "other":Phy, "x":float, "k":float, "string":bool},...]
:return: None
'''
for i in biao:
i["self"].resilience(i["x"],i["k"],i["other"],i["string"])
def bounce(self, k, other="*"):
'''
对指定点施以弹力(撞击时)
:param k: float 劲度系数
:param other: "*" 或 Phy 施力的另一个物体,当为"*"时指对所有点
:return: None 直接修改a,无返回
'''
if other == "*":
for i in Phy.biao:
if i == self:
continue
elif (((i.p[0] - self.p[0]) ** 2 + (i.p[1] - self.p[1]) ** 2 + (
i.p[2] - self.p[2]) ** 2) ** 0.5) - self.r - i.r <= 0:
self.resilience(self.r + i.r, k / 2, i)
else:
if (((other.p[0] - self.p[0]) ** 2 + (other.p[1] - self.p[1]) ** 2 + (
other.p[2] - self.p[2]) ** 2) ** 0.5) - self.r - other.r <= 0:
self.resilience(self.r + other.r, k, other)
@classmethod
def gravity(cls, g):
'''
对全部点施以引力
:param g: float 引力常数
:return: None 直接修改a,无返回
'''
for oout in Phy.biao:
for oin in Phy.biao:
if oout == oin:
continue
r = ((oout.p[0] - oin.p[0]) ** 2 + (oout.p[1] - oin.p[1]) ** 2 + (oout.p[2] - oin.p[2]) ** 2) ** 0.5
G = g * oout.m * oin.m / (r ** 2)
oout.force2(G, oin.p)
@classmethod
def coulomb(cls,k):
'''
对全部点施以静电力
:param k: 静电力常量
:return: None 直接修改a,无返回
'''
for oout in Phy.biao:
for oin in Phy.biao:
if oout == oin:
continue
r = ((oout.p[0] - oin.p[0]) ** 2 + (oout.p[1] - oin.p[1]) ** 2 + (oout.p[2] - oin.p[2]) ** 2) ** 0.5
f = -k * oout.e * oin.e / (r ** 2)
oout.force2(f, oin.p)
def electrostatic(self,k):
'''
对某点施以静电力
:param k: 静电力常量
:return: None 直接修改a,无返回
'''
for i in Phy.biao:
if i==self:
continue
r = ((self.p[0]-i.p[0])**2+(self.p[1]-i.p[1])**2+(self.p[2]-i.p[2])**2)**0.5
if r==0:
r=10e-9
f = -k*self.e*i.e/r**2
self.force2(f,i.p)
@classmethod
def momentum(cls):
'''
计算全局动量和
:return: list[x,y,z] 矢量
'''
dongliang = [0, 0, 0]
for i in Phy.biao:
dongliang[0] += i.v[0] * i.m
dongliang[1] += i.v[1] * i.m
dongliang[2] += i.v[2] * i.m
return dongliang
@classmethod
def run(cls, t):
'''
运行当前模型(力的应该在run之前运算)
:param t: float 运行一帧的时间
:return: None 直接修改每个点的v、p、a,无返回
'''
for dian in Phy.biao:
dian.v[0] = dian.v[0] + dian.a[0] * t
dian.v[1] = dian.v[1] + dian.a[1] * t
dian.v[2] = dian.v[2] + dian.a[2] * t
dian.p[0] = dian.p[0] + dian.v[0] * t
dian.p[1] = dian.p[1] + dian.v[1] * t
dian.p[2] = dian.p[2] + dian.v[2] * t
dian.axianshi = dian.a[:]
dian.a = [0, 0, 0]
@classmethod
def hprun(cls,t):
'''
以更高精度运行当前模型(建议在恒力模型中使用,力的应该在run之前运算)
:param t: float 运行一帧的时间
:return: None 直接修改每个点的v、p、a,无返回
'''
for dian in Phy.biao:
dian.p[0] = dian.p[0] + dian.v[0] * t + 0.5 * dian.a[0] * t ** 2
dian.p[1] = dian.p[1] + dian.v[1] * t + 0.5 * dian.a[1] * t ** 2
dian.p[2] = dian.p[2] + dian.v[2] * t + 0.5 * dian.a[2] * t ** 2
dian.v[0] = dian.v[0] + dian.a[0] * t
dian.v[1] = dian.v[1] + dian.a[1] * t
dian.v[2] = dian.v[2] + dian.a[2] * t
dian.axianshi = dian.a[:]
dian.a = [0, 0, 0]
@classmethod
def tready(cls):
'''
在使用显示模块前需要调用这个函数
:return: None
'''
import turtle
turtle.tracer(0)
turtle.penup()
turtle.hideturtle()
没有合适的资源?快使用搜索试试~ 我知道了~
基于python和牛顿力学的物理模拟装置.zip
共33个文件
py:32个
license:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 89 浏览量
2024-02-16
09:50:21
上传
评论
收藏 28KB ZIP 举报
温馨提示
基于Python开发的系统
资源推荐
资源详情
资源评论
收起资源包目录
基于python和牛顿力学的物理模拟装置.zip (33个子文件)
Wuli-main
wulitest
wulitest23.py 858B
wulitest16.py 2KB
wulitest20.py 484B
wulitest18.py 617B
wulitest9.5.py 2KB
wulitest12.py 878B
wulitest17.py 2KB
wulitest3.py 500B
wulitest24.py 279B
wulitest26.py 320B
wulitest10.py 3KB
wulitest_du.py 290B
wulitest4.py 611B
wulitest19.py 2KB
wulitest6.py 640B
wulitest_save_simplify.py 714B
wulitest25.py 851B
wulitest10 city.py 4KB
wulitest34.py 2KB
wulitest30.py 1KB
wulitest22.py 902B
wulitest29.py 848B
wulitest.py 505B
wulitest15.py 2KB
wuli.py 21KB
wulitest21.py 488B
wulitest13.py 571B
wulitest28.py 825B
wulitest8.py 427B
wulitest27.py 640B
wulitest9.py 1019B
LICENSE 1KB
wuli.py 21KB
共 33 条
- 1
资源评论
我慢慢地也过来了
- 粉丝: 6409
- 资源: 3988
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python 程序语言设计模式思路-行为型模式:策略模式:将算法封装成独立的类,并使它们可以互相替换及支付模式数据压缩
- main.py
- Last Loaded Test.DBK
- Screenshot_20240520_163011.jpg
- ubuntu-python3-whisper-tornado docker镜像 Dockerfile
- ubuntu-python3-whisper-tornado docker镜像07
- 新录音 8.m4a
- ubuntu-python3-whisper-tornado docker镜像
- ubuntu-python3-whisper-tornado docker镜像
- ubuntu-python3-whisper-tornado docker镜像09
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功