玫瑰线的说法源于欧洲海图。在中世纪的航海地图上,并没有经纬线,有的只是一些从中心有序地向外辐射的互相交叉的直线方向线。此线也称罗盘线,希腊神话里的各路风神被精心描绘在这些线上,作为方向的记号。葡萄牙水手则称他们的罗盘盘面为风的玫瑰(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')