鱼C论坛

 找回密码
 立即注册
查看: 1785|回复: 4

[已解决]请教C/C++/Python中关于曲线的算法

[复制链接]
发表于 2023-10-8 19:24:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有一个简单的表达式 y=x ,在二维坐标轴上显示为一条直线,x和y的取值范围都是 0~255
我想让他们的对应关系显示为一条曲线,具体就是:
x=0时,y=0
x=255时,y=255

当x从50~0变化时, y处于减速下降的曲线,
当x从205~255变化时, y处于减速上升的曲线,
当x处于50~205的中间阶段时,y处于加速上升曲线

说起来很复杂,其实就是在x轴的50和205两个点对曲线做一个平滑调整
请问该怎么写这样的一种对应关系呢?

用C/C++/Python都无所谓,这个属于数学问题,基本上是编程语言都可以完成



最佳答案
2023-10-8 19:25:17
这个问题可以通过使用三次样条插值方法来解决。在C/C++/Python中,可以使用一些数学库来实现这个算法,如SciPy、NumPy和GSL等。下面是使用Python的SciPy库实现的示例代码:
import numpy as np
from scipy.interpolate import CubicSpline

# 定义x和y的取值范围
x = np.array([0, 50, 205, 255])
y = np.array([0, 0, 255, 255])

# 使用三次样条插值方法生成曲线函数
cs = CubicSpline(x, y)

# 生成x轴的取值范围
xx = np.arange(0, 256)

# 生成对应的y轴取值
yy = cs(xx)

# 打印结果
print(yy)

在这个示例代码中,我们首先定义了x和y的取值范围,然后使用CubicSpline函数生成了曲线函数cs。最后,我们生成了x轴的取值范围xx,并使用cs函数计算对应的y轴取值yy。最终的结果就是一个平滑的曲线,符合要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-8 19:25:13 | 显示全部楼层
问题解答

你可以使用数学函数来实现这个对应关系。具体来说,你可以分为三个阶段来定义 y 的取值:

1. 当 x 在 0 到 50 之间时,y 是一个减速下降的曲线。你可以使用平方根函数来实现这个曲线,如 y = sqrt(x)。

2. 当 x 在 50 到 205 之间时,y 是一个加速上升的曲线。你可以使用幂函数来实现这个曲线,如 y = x^3。

3. 当 x 在 205 到 255 之间时,y 是一个减速上升的曲线。你可以使用幂函数或者指数函数来实现这个曲线,如 y = (255 - x)^2 或者 y = exp(x - 255)。

下面给出了在 Python 中实现这个对应关系的代码示例:
import matplotlib.pyplot as pltimport numpy as npx = np.arange(0, 256)y = np.piecewise(x, [    x < 50,                         # x < 50 是减速下降    (x >= 50) & (x <= 205),         # 50 <= x <= 205 是加速上升    x > 205                         # x > 205 是减速上升    ], [    lambda x: np.sqrt(x),            # 减速下降阶段    lambda x: x**3,                  # 加速上升阶段    lambda x: (255 - x)**2 or np.exp(x - 255)  # 减速上升阶段,可选幂函数或指数函数])plt.plot(x, y)plt.xlabel('x')plt.ylabel('y')plt.title('Curve')plt.show()
这段代码使用 numpy 库中的 piecewise 函数来实现对应关系。然后使用 matplotlib 库绘制曲线图形。

希望这个解答能够帮助到你!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-8 19:25:17 | 显示全部楼层    本楼为最佳答案   
这个问题可以通过使用三次样条插值方法来解决。在C/C++/Python中,可以使用一些数学库来实现这个算法,如SciPy、NumPy和GSL等。下面是使用Python的SciPy库实现的示例代码:
import numpy as np
from scipy.interpolate import CubicSpline

# 定义x和y的取值范围
x = np.array([0, 50, 205, 255])
y = np.array([0, 0, 255, 255])

# 使用三次样条插值方法生成曲线函数
cs = CubicSpline(x, y)

# 生成x轴的取值范围
xx = np.arange(0, 256)

# 生成对应的y轴取值
yy = cs(xx)

# 打印结果
print(yy)

在这个示例代码中,我们首先定义了x和y的取值范围,然后使用CubicSpline函数生成了曲线函数cs。最后,我们生成了x轴的取值范围xx,并使用cs函数计算对应的y轴取值yy。最终的结果就是一个平滑的曲线,符合要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-8 21:23:17 | 显示全部楼层
Mike_python小 发表于 2023-10-8 19:25
问题解答

你可以使用数学函数来实现这个对应关系。具体来说,你可以分为三个阶段来定义 y 的取值:

画出来的曲线不对,而且x=255时y不等于255呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-8 21:25:11 | 显示全部楼层
isdkz 发表于 2023-10-8 19:25
这个问题可以通过使用三次样条插值方法来解决。在C/C++/Python中,可以使用一些数学库来实现这个算法,如Sc ...

你这个有点问题,头尾曲线部分,y的值超出了0~255的限制,怎么把y值限制在0~255内做减速变化,而不是超出限制或直接变成0与255的水平线呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表