python画玫瑰曲线_数学的有趣图形-玫瑰线

玫瑰线的说法源于欧洲海图。在中世纪的航海地图上,并没有经纬线,有的只是一些从中心有序地向外辐射的互相交叉的直线方向线。此线也称罗盘线,希腊神话里的各路风神被精心描绘在这些线上,作为方向的记号。葡萄牙水手则称他们的罗盘盘面为风的玫瑰(rosedosventor)。水手们根据太阳的位置估计风向,再与“风玫瑰”对比找出航向。玫瑰线,即指引方向的线。

极坐标方程表示为:

直角坐标系方程表示为:

根据三角函数的特性可知,玫瑰线是一种具有周期性且包络线为圆弧的曲线,曲线的几何结构取决于方程参数的取值,不同的参数决定了玫瑰线的大小、叶子的数目和周期的可变性。这里参数a(包络半径)控制

叶子的长短,参数n控制叶子的个数、叶子的大小及周期的长短。

如对于方程式

分别对应的是三叶、四叶和六叶玫瑰线。

玫瑰线总面积

玫瑰线的参数特性

玫瑰线的参数主要是a、n及θ,其值的大小决定玫瑰线的形状,包括叶子数、叶子长度宽度和曲线闭合周期。系数a只跟叶子的长度有关,而n和θ则影响玫瑰线的多样性和周期性,本文主要讨论n和θ对玫瑰线几何结构的影响,从而揭示玫瑰线的生成规则。通过计算机对方程式ρ=a* sin(nθ)的大量试验,证明玫瑰线具有如下三个特性:

特性1 当n为整数时,若n为奇数,则玫瑰线的叶子数为n,闭合周期为π,即θ角在0-π内玫瑰线是闭合的。当n为偶数时,玫瑰线的叶子数为2n,闭合周期为2π,即θ角取值在0-2π内玫瑰线才是闭合和完整的。

特性2 当n为非整数的有理数时,设为L/W,且L/W为简约分数,此时,L与W不可能同时为偶数。L决定玫瑰线的叶子数,W决定玫瑰线的闭合周期(Wπ或2Wπ,见特性3)及叶子的宽度,W越大,叶子越宽。但W也会同时影响叶子数的多少,对同一奇数值L,在W分别取奇数和偶数值时,叶子数也是不同的。

特性3 当L或W中有一个为偶数时,玫瑰线的叶子数为2L,闭合周期为2Wπ。当L或W同为奇数时,玫瑰线的叶子数为L,闭合周期为Wπ。换句话说,生成偶数个叶子的玫瑰线, L或W中必须有且只有一个为偶数值,且L为叶子数的一半,而生成奇数个叶子的玫瑰线, L和W都必须为奇数,且L值就是叶子数。 [1]

玫瑰线的生成规则

对于给定叶子数的玫瑰线,可以通过选择n或L/W不同形式来生成。

python画图

from matplotlib import pyplot as plt

import numpy as np

import math

i = np.linspace(-2*math.pi,2*math.pi,500)

theta=5*np.sin(3*i)

plt.subplot(221,projection='polar')

plt.plot(i,theta)

plt.title('p=5*sin(3*i)',color='r')

theta=5*np.sin(2*i)

plt.subplot(222,projection='polar')

plt.plot(i,theta)

plt.title('p=5*sin(2*i)',color='r')

theta=5*np.sin(3/2*i)

plt.subplot(223,projection='polar')

plt.plot(i,theta)

plt.title('p=5*sin(3/2i)',color='r')

theta=5*np.sin(1*i)

plt.subplot(224,projection='polar',title='p=5*sin(3*i)')

plt.plot(i,theta)

plt.title('p=5*sin(1*i)',color='r')

plt.show()

动态画图

from matplotlib import pyplot as plt

import numpy as np

import math

i = np.linspace(0,2*math.pi,500)

theta=5*np.sin(3*i)

plt.title('p=5*sin(3*i)',color='r')

i_list=[]

theta_list=[]

for (i_tmp,theta_tmp) in zip(i,theta):

i_list.append(i_tmp)

theta_list.append(theta_tmp)

#去除负值,使得动画更顺畅

if(theta_tmp>=0):

plt.plot(i_list,theta_list)

plt.pause(0.01)

plt.axes(polar=True)

plt.ylim(0,5)

#保存动画

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation

# 生成图例

fig = plt.figure(figsize=(5,5))

ax = plt.subplot(projection='polar')

# 绘制动态函数的变量

x = np.linspace(0, 2*np.pi, 500)

# 实例化线条

line, = ax.plot([], [], color='r')

r,theta=[],[]

def init():

# 设置y轴的范围

ax.set_ylim(0, 5)

return line

# 更新函数,n是动态变量

def update(n):

# 更新数据

theta.append(n)

r.append(5*np.sin(3*n))

line.set_xdata(theta)

line.set_ydata(r)

return line

# frames在调用update函数时,会将frames后面的数据作为实参传递给“n”

# interval更新频率,单位ms

ani = animation.FuncAnimation(fig, update,frames=x,init_func=init,interval=10)

ani.save('sin.gif',writer='pillow')

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值