超椭圆的三两个实验

在小米春季新品发布会上,小米的CEO雷军宣布,小米正式推出全新LOGO,采用新的超椭圆轮廓设计,替换原先的方形轮廓

椭圆轮廓vs方形轮廓

超椭圆是超椭圆曲线的简称,是拉梅曲线的一个分支,拉梅曲线最初由法国科学家拉梅(Gabriel Lame)发现和提出的,是一种类似于椭圆的封闭曲线,保留了椭圆的长轴、短轴、对称性的特点。拉梅曲线的数学方程如下:

∣ x ∣ n + ∣ y ∣ n = 1 |x|^n+|y|^n=1 xn+yn=1

当参数n大于1的时候就是超椭圆,超椭圆的形状是一种介于正圆形到正方形之间的的形状,而当n小于1的时候就是星形线
拉梅曲线

我们来做几个关于超椭圆的实验,限定再笛卡尔直角坐标系下

(1) n是正偶数

当n为偶数的时候,随着n逐渐变大,其形状越来越往外拓,越来越饱满,特别的,n=2的时候就是常规的半径为1的的单位圆,而n趋向无穷的时候就是一个边长为1的单位正方形。

# n为偶数
ns = np.arange(2, 34, step=2) #设定n值范围
plt.figure(figsize=(6, 6)) #新建画布
for ind_, n in enumerate(ns): 
    plt.subplot(math.isqrt(len(ns)), math.isqrt(len(ns)), ind_+1) #4*4的子图
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-myx**n)**(1/n) #横坐标
    plt.plot(myx, myy, c ="blue", linewidth = 0.3)  #y正半轴
    plt.plot(myx, -myy, c= "blue", linewidth = 0.3) #y负半轴
    plt.title(y = 0.85, label="n="+ str(n), fontsize = 5,  loc = "right")  #标题
    plt.tick_params(labelsize = 4)#刻度字体大小
plt.show()

其效果图如下

(2) n是正奇数

从拉梅曲线方程来看,如果n是正奇数的话,可能会出现复数的情形,所以需要先取绝对值,再开方,形状跟n为正偶数差不多

# n为奇数
ns = np.arange(3, 35, step=2) #设定n值范围
plt.figure(figsize=(6, 6)) #新建画布
for ind_, n in enumerate(ns): 
    plt.subplot(math.isqrt(len(ns)), math.isqrt(len(ns)), ind_+1) #4*4的子图
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-np.abs(myx)**n)**(1/n) #横坐标
    plt.plot(myx, myy, c ="blue", linewidth = 0.3)  #y正半轴
    plt.plot(myx, -myy, c= "blue", linewidth = 0.3) #y负半轴
    plt.title(y = 0.85, label="n="+ str(n), fontsize = 5,  loc = "right")  #标题
    plt.tick_params(labelsize = 4)#刻度字体大小
plt.show()

效果图如下

n为偶数

(3) n是大于2的正整数

既然n可以取偶数也可以取奇数,那么就统一一下,取大于2的正整数,与n是正奇数差不多

# n为大于2的正整数
ns = np.arange(2, 18, step=1) #设定n值范围
print(ns, len(ns), math.isqrt(len(ns)), math.isqrt(len(ns))+1 )
plt.figure(figsize=(6, 6)) #新建画布
for ind_, n in enumerate(ns): 
    plt.subplot(math.isqrt(len(ns)), math.isqrt(len(ns)), ind_+1) #4*4的子图
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-np.abs(myx)**n)**(1/n) #横坐标
    plt.plot(myx, myy, c ="blue", linewidth = 0.3)  #y正半轴
    plt.plot(myx, -myy, c= "blue", linewidth = 0.3) #y负半轴
    plt.title(y = 0.85, label="n="+ str(n), fontsize = 5,  loc = "right")  #标题
    plt.tick_params(labelsize = 4)#刻度字体大小
plt.show()

其效果图如下

n为奇数

(4) 动图

这种随着n变化而变化的图,可以通过动图的展示对比来看会更加直观

# 动图
fig = plt.figure(figsize=(4, 4)) #新建画布模板
plt.ylabel('x', fontsize =5) #x轴
plt.xlabel('y', fontsize =5) #y轴
plt.tick_params(labelsize = 4)#刻度字体大小

def  chartFunc(i = int): #定义超椭圆曲线图
    colormap = cm.rainbow(np.linspace(0, 1, 10))
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-np.abs(myx)**i)**(1/i) #横坐标
    plt.plot(myx, myy, linewidth = 0.3, color = colormap[i])  #y正半轴
    plt.plot(myx, -myy, linewidth = 0.3, color = colormap[i]) #y负半轴
    plt.title(y = 0.5, label = "$|x|^{}+|y|^{}=1$".format(str(i), str(i)), loc = "center")

animator = FuncAnimation(fig, chartFunc, frames = np.arange(2, 10, step=1),  interval = 500, repeat = True) #渲染动图
animator.save("D:\markdown\配套图片\superellipse.gif", writer="pillow") #保存为gif动图

效果如下动图所示

超椭圆

今天我们的实验就到这里了,如果小伙伴有什么有问题欢迎留言!

二维码

猜你喜欢

转载自blog.csdn.net/zengbowengood/article/details/115633374