大家好,小编来为大家解答以下问题,python画圆弧组成的花瓣代码,用python画弧形指定长度,现在让我们一起来看看吧!
Python的画图模块matplotlib没有直接画圆弧的方法,需要通过圆心和半径将圆弧上的点的坐标构造出来,然后再用plot方法即可画出圆弧
首先定义一个构造圆弧坐标的函数circle_array:(更新:优化了circle_array的写法)
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import numpy as np
import pandas as pd
xc,yc = 1,2 #圆心
r1,r2,r3 = 3,4,5 #半径
def circle_array(xc,yc,r,start,end):
#根据圆心、半径、起始角度、结束角度,生成圆弧的数据点
phi1 = start*np.pi/180.0
phi2 = end*np.pi/180.0
dphi = (phi2-phi1)/np.ceil(200*np.pi*r*(phi2-phi1)) #根据圆弧周长设置等间距
#array = np.arange(phi1, phi2+dphi, dphi) #生成双闭合区间(Python默认为左闭右开)
#当dphi为无限小数时,上述方法可能由于小数精度问题,导致array多一个元素,将代码优化为下面两行
array = np.arange(phi1, phi2, dphi)
array = np.append(array,array[-1]+dphi)#array在结尾等距增加一个元素
return xc + r*np.cos(array),yc + r*np.sin(array)
1. 画圆
#画圆
plt.figure(figsize=(5,5))
X1,Y1 = circle_array(xc,yc,r1,0,360)
X2,Y2 = circle_array(xc,yc,r2,0,360)
X3,Y3 = circle_array(xc,yc,r3,0,360)
plt.plot(X1,Y1)
plt.plot(X2,Y2)
plt.plot(X3,Y3)
plt.scatter(xc,yc,c='black',marker='o')#画圆心
plt.savefig('circle1.png')
plt.show()
2. 画圆弧
plt.figure(figsize=(5,5))
X1,Y1 = circle_array(xc,yc,r1,0,90)
X2,Y2 = circle_array(xc,yc,r2,60,270)
X3,Y3 = circle_array(xc,yc,r3,180,360)
plt.plot(X1,Y1)
plt.plot(X2,Y2)
plt.plot(X3,Y3)
plt.scatter(xc,yc,c='black',marker='o')#画圆心
plt.savefig('circle2.png')
plt.show()
3. 画扇形
#画扇形
plt.figure(figsize=(5,5))
X1,Y1 = circle_array(xc,yc,r1,0,60)
X3,Y3 = circle_array(xc,yc,r3,200,330)
#将圆心和圆弧首尾相连
X1 = [xc] + X1+ [xc]
Y1 = [yc] + Y1+ [yc]
X3 = [xc] + X3+ [xc]
Y3 = [yc] + Y3+ [yc]
plt.plot(X1,Y1)
plt.plot(X3,Y3)
plt.scatter(xc,yc,c='black',marker='o')#画圆心
plt.savefig('circle3.png')
plt.show()
4. 画平滑曲线
根据点直接通过plot方法画出来的是折现,有时候显得生硬,要画出平滑曲线,需先进行插值,当点足够密集时,画出来的折现就变成了平滑曲线,插值函数有很多方法,可以直接调用scipy.interpolate 的interp1d函数
#画平滑曲线
u = np.array([1,2,4,6,7,8.5])
v = np.array([2,4,3.3,5.5,6,7.7])
cubic_interploation_model=interp1d(u,v,kind="cubic")
xs=np.linspace(u.min(),u.max(),100)
ys=cubic_interploation_model(xs)
plt.plot(xs,ys,c='black')
plt.scatter(u,v,c='black',marker='o')
plt.savefig('circle4.png')
plt.show()