我正在尝试在两个整数之间生成一条非线性曲线,假设0和25在此处与该曲线相匹配:
这似乎是一个愚蠢的简单问题,我甚至需要的曲线看起来像是圆的一部分,因此生成一个大圆并取右下角的点即可解决此问题,但是我不知道该怎么做任何一个。
我所需要的是从0到25的列表,其中曲线是该列表的一部分,如果有道理的话。开始缓慢增加,然后加速,然后在快结束时减速。
我已经尝试了类似的结果,但是它的角度/曲线不正确。
x=[]
y=range(25)
for i in range(25):
x.append((i**.25)**2)
plt.plot(x, y)
plt.show()
谢谢
答案 0 :(得分:3)
如果您真的想拥有相同的曲线,则可以加载绘图图像,并使用PIL获取每个蓝色像素:
this.sbv.size = this.content.offsetHeight / this.content.scrollHeight;
this.sbv.style.height = (this.sbv.size * 100) + "%";
this.sbv.max = (100 - this.sbv.size * 100) / 100 * this.content.offsetHeight;
this.sbv.pos = this.content.scrollTop / this.content.scrollHeight * this.content.offsetHeight;
this.sbv.style.top = (this.sbv.pos / this.content.offsetHeight * 100) + "%";
this.sbh.size = this.content.offsetWidth / this.content.scrollWidth;
this.sbh.style.width = (this.sbh.size * 100) + "%";
this.sbh.max = (100 - this.sbh.size * 100) / 100 * this.content.offsetWidth;
this.sbh.pos = this.content.scrollLeft / this.content.scrollWidth * this.content.offsetWidth;
this.sbh.style.left = (this.sbh.pos / this.content.offsetWidth * 100) + "%";
然后,知道图中的(0,20)是像素(63,355),而图中的(25,160)是像素(516,32),则可以将像素坐标转换为数据点:
from urllib.request import urlopen
from PIL import Image
img = Image.open(urlopen('https://i.stack.imgur.com/NpiMq.png'))
X = []
Y = []
for x in range(img.size[0]):
for y in range(img.size[1]):
r, g, b, a = img.getpixel((x, y))
if b > r and b > g:
X.append(x)
Y.append(y)
最后,您可以使用numpy polyfit来获得与先前获得的点的多项式拟合:
X = [(x - 63) * (25 - 0) / (516 - 63) + 0 for x in X]
Y = [(y - 355) * (160 - 20) / (32 - 355) + 20 for y in Y]
然后,使用>>> np.polyfit(X, Y, 3)
[ 8.23918277e-03 -7.33330644e-02 2.60046715e+00 2.03012850e+01]
绘制结果以得到给定poly1d
值返回其x
值的函数:
y