pyhthon绘制超炫酷的心形线星形线摆线
作者:微小冷 发布时间:2021-01-15 14:02:30
摆线
最简单的旋轮线就是摆线,指圆在直线上滚动时,圆周上某定点的轨迹。
设圆的半径为 r ,在x轴上滚动 x距离则意味着旋转了 x \ r 弧度,则其滚动所产生的摆线如下
r = 1
theta = np.arange(0,6.4,0.1)
xCircle0 = np.cos(theta)
yCircle0 = 1+np.sin(theta)
fig = plt.figure(figsize=(15,4))
ax = fig.add_subplot(autoscale_on=False,
xlim=(1,10),ylim=(0,2))
ax.grid()
circle, = ax.plot(xCircle0,yCircle0,'-',lw=1)
point, = ax.plot([1],[1],'o')
trace, = ax.plot([],[],'-', lw=1)
theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes)
textTemplate = '''x = %.1f°\n'''
xs,ys = [], []
def animate(x):
if(x==0):
xs.clear()
ys.clear()
xCycloid = x + r*np.cos(-x) #由于是向右顺时针滚,所以角度为负
yCycloid = 1 + r*np.sin(-x)
xCircle = xCircle0+x
xs.append(xCycloid)
ys.append(yCycloid)
circle.set_data(xCircle,yCircle0)
point.set_data([xCycloid],[yCycloid])
trace.set_data(xs,ys)
theta_text.set_text(textTemplate % x)
return circle, point, trace, theta_text
frames = np.arange(0,10,0.02)
ani = animation.FuncAnimation(fig, animate, frames,
interval=5, blit=True)
ani.save("Cycloid.gif")
plt.show()
如果选取圆内或圆外的一点描成轨迹,则为次摆线,圆外点的轨迹为长幅摆线,
反之则为短幅摆线
代码
r = 1
rIn = 0.5
theta = np.arange(0,6.4,0.1)
xCircle0 = np.cos(theta)
yCircle0 = 1+np.sin(theta)
xCircleOut0 = rIn*np.cos(theta)
yCircleOut0 = 1+rIn*np.sin(theta)
fig = plt.figure(figsize=(20,3))
ax = fig.add_subplot(autoscale_on=False,
xlim=(1,15),ylim=(0,2))
ax.grid()
circle, = ax.plot(xCircle0,yCircle0,'-',lw=1)
circleOut, = ax.plot(xCircleOut0,yCircleOut0,linestyle='--',lw=1)
point, = ax.plot([1],[1],'o')
pointOut, = ax.plot([1],[1.5],'o')
trace, = ax.plot([],[],'-', lw=1)
theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes)
textTemplate = '''x = %.1f\n'''
xs,ys = [], []
def animate(x):
if(x==0):
xs.clear()
ys.clear()
xCycloid = x + r*np.cos(-x)
yCycloid = 1 + r*np.sin(-x)
xCycloidOut = x + rIn*np.cos(-x)
yCycloidOut = 1 + rIn*np.sin(-x)
xs.append(xCycloidOut)
ys.append(yCycloidOut)
circle.set_data(xCircle0+x,yCircle0)
circleOut.set_data(xCircleOut0+x,yCircleOut0)
point.set_data([xCycloid],[yCycloid])
pointOut.set_data([xCycloidOut],[yCycloidOut])
trace.set_data(xs,ys)
theta_text.set_text(textTemplate % x)
return circle, circleOut, point, pointOut, trace, theta_text
frames = np.arange(0,15,0.1)
ani = animation.FuncAnimation(fig, animate, frames,
interval=50, blit=True)
ani.save("Cycloid.gif")
plt.show()
随着 λ 的变化,图像的变化过程为
外摆线和心脏线
如果在一个圆绕着另一个固定的圆滚动,如果在圆外滚动,则动圆上的某相对固定点的轨迹为外摆线;若在圆内滚动,则某点的轨迹为内摆线。设定圆半径为 a ,动圆半径为 b ,则绕行旋转 t度后,动圆圆心圆心位置为
若选点 ( a , 0 ) 作为起点,则外摆线的参数方程为
a = b 时就得到了著名的心脏线,被许多直男奉为经典
a = 1
b = 1
theta = np.arange(0,6.4,0.05)
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(autoscale_on=False,
xlim=(-3,3),ylim=(-3,3))
theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes)
textTemplate = '''θ = %.1f°\n'''
ax.grid()
xCircle,yCircle = np.cos(theta),np.sin(theta)
ax.plot(a*xCircle,a*yCircle,'-',lw=1)
pt, = ax.plot([a+b],[0],'*')
cir, = ax.plot(a+b+b*yCircle,b*yCircle,'-',lw=1)
cycloid, = ax.plot([], [], '-', lw=1)
xs,ys = [],[]
def animate(t):
if(t==0):
xs.clear()
ys.clear()
cenX = (a+b)*np.cos(t)
cenY = (a+b)*np.sin(t)
cir.set_data(cenX+b*xCircle,cenY+b*yCircle)
newX = cenX - b*np.cos((a+b)/b*t)
newY = cenY - b*np.sin((a+b)/b*t)
xs.append(newX)
ys.append(newY)
pt.set_data([newX],[newY])
cycloid.set_data(xs,ys)
theta_text.set_text(textTemplate % t)
return cycloid, cir, pt, theta_text
ani = animation.FuncAnimation(fig, animate, theta,
interval=50, blit=True)
ani.save("Cycloid.gif")
plt.show()
如果更改 a \ b比值,则可得到
a \ b=2
a \ b=5
a \ b=1\2
a \ b=2\3
对 a\b进行约分得到 m \ n,曲线由 m支组成,总共绕定圆 n周,然后闭合。观察 1 \b = 1 \2 时的曲线,可以看到其前 p i 个值和后 π 个值组成的心形更好看。
如果 a\b是无理数,则永远也不会闭合,例如令 b = e ,由于图片超过5M,所以就不上传了。这个图总共转了17圈,到后期十分考验视力,为了让规律更清晰,我们选择只绘制尖点附近的运动状态,
内摆线与星形线
当动圆在定圆内部转动时,则为内摆线,其方程为
a\b=2
a\b=4
a\b=5
a \b = 1\3
当 a \b = 4 时,其方程可化简为
被称为星形线。
接下来按照惯例,画一下随着 a\ b 比值的变化,内外摆线形状的变化过程
外摆线
内摆线
代码如下
#test.py
import argparse #用于命令行的交互
parser = argparse.ArgumentParser()
parser.add_argument('bStart', type=float)
parser.add_argument('bEnd', type=float)
args = parser.parse_args()
a = 1
bStart = args.bStart
bEnd = args.bEnd
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(autoscale_on=False,
xlim=(-(a+2*bEnd),(a+2*bEnd)),ylim=(-(a+2*bEnd),(a+2*bEnd)))
theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes)
textTemplate = '''a=1, b= %.2f\n'''
ax.grid()
t = np.arange(0,6.4,0.05)
ax.plot(a*np.cos(t),a*np.sin(t),'-',lw=1)
cycloid, = ax.plot([], [], '-', lw=1)
xs,ys = [],[]
t = np.arange(0,30,0.05)
def animate(b):
xs = (a+b)*np.cos(t) - b*np.cos((a+b)/b*t)
ys = (a+b)*np.sin(t) - b*np.sin((a+b)/b*t)
cycloid.set_data(xs,ys)
theta_text.set_text(textTemplate % b)
return cycloid, theta_text
ani = animation.FuncAnimation(fig, animate, np.arange(bEnd,bStart,-0.02),
interval=50, blit=True)
plt.show()
ani.save("Cycloid.gif")
在命令行中输入
python test.py -2 2
内摆线和外摆线同常规的摆线一样,皆具有对应的长辐或短辐形式,其标准方程为
当 b > 0时为外摆线, b < 0时为内摆线,对于星形线而言,其变化过程如图所示
来源:https://blog.csdn.net/m0_37816922/article/details/120683674?spm=1001.2014.3001.5501
猜你喜欢
- 本文实例讲述了Python subprocess模块常见用法。分享给大家供大家参考,具体如下:subprocess模块是python从2.4
- 本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下游戏的实现本质是多个图片的快速切换,类似动画一样,达到动态的
- 本文实例讲述了PHP实现无限极分类的两种方式。分享给大家供大家参考,具体如下:面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表
- 主要原理:调整dicom的窗宽,使之各个像素点上的灰度值缩放至[0,255]范围内。使用到的python库:SimpleITK下面是一个将d
- 一、方法2此方法是两个表构建某一相同字段,然后全连接,在做匹配结果筛选,此方法针对数据量不大的时候,逻辑比较简单,但是内存消耗较大1. 导入
- 环境管理管理 Python 版本和环境的工具p:非常简单的交互式 python 版本管理工具。官网pyenv:简单的 Python 版本管理
- abs()返回一个数字的绝对值,它的参数可以是整数或者浮点数。举个例子:all()参数为一个可迭代对象,如果该可迭代对象所有元素的真值都为T
- 概述从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类
- 本文研究的主要是python中协程的相关问题,具体介绍如下。Num01–>协程的定义协程,又称微线程,纤程。英文名Coroutine。
- 说起模板引擎,很多人会认为这是后台的东西(如PHP的Smarty、Java的Velocity),跟前端没有关系。然而,随着前端的逻辑变得越来
- 在 Go 语言中切片是使用非常频繁的一种聚合类型,它代表变长的序列,底层引用一个数组对象。一个切片由三个部分构成:指针、长度和容量。指针指向
- 本文研究的主要是Python web开发框架Django的管理界面的相关内容,具体如下。admin界面的路径,通常在my_project中已
- 本文实例讲述了Vue.js添加组件操作。分享给大家供大家参考,具体如下:<!DOCTYPE HTML><html>
- c shell perl php下的日期时间转换: 秒数与人类可读日期 scalar localtime 与 seconds since `
- javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javas
- CREATE OR REPLACE PROCEDURE PROC6338196642095312503719(输入新闻主题 Varchar2
- 本文实例讲述了Python事务操作实现方法。分享给大家供大家参考,具体如下:#coding=utf-8import sysimport My
- 一.MYSQL的命令行模式的设置桌面->我的电脑->属性->环境变量->新建->PATH=“;path\mys
- 第一阶段:从官网下载Anaconda之后,安装,一切正常。打开Anaconda navigator,提示我是否更新,要选不要更新。点击spy
- 前言我们在写sql语句的时候,总是无法避免使用到连接关键词,比如内连接、外连接。种类是很多的,我在这里贴上一张在别处找到的图:这张图我认为是