gpt4 book ai didi

c++ - 从三次贝塞尔曲线的 x 坐标获取 y,快速 Newton-Raphson 方法

转载 作者:行者123 更新时间:2023-11-28 08:08:41 25 4
gpt4 key购买 nike

给定二维贝塞尔曲线的点(P0、P1、P2、P3),我想找到给定 x 坐标的 y 坐标。由于以下限制,该问题定义明确:

  • P0 = (0,0), P3 = (1,1)
  • P1 = (t, 1-t) 对于 t 在 0, 1 之间
  • P2 = 1 - P1(x 和 y)

我有以下函数来计算答案,已经设置了所有限制上面的贝塞尔曲线公式在这里CubicBezier.html .我正在使用 Newton-Raphson 计算出我想要的点的参数,我知道这是可行的,因为我不会让循环完成直到它完成(在定义的公差范围内)。

我正在使用此函数对图像应用对比度滤镜。对于这个 0.5 返回相同的图像,0.0 最大程度地降低对比度,1.0 最大程度地增加对比度。

编辑 以下功能已更正,现在可以完美运行。

/*
* Parameters: p - x co-ord of P1,
* x - x we want to find y for
*
* This method is unstable for p ~= 0.5, maybe needs refinement.
*/

#include <iostream>
#include <math.h>

#define ITER_TOL 0.00001

float maths::bezier(float p, float x)
{
if(p < 0.f || p > 1.f || x < 0.f || x > 1.f)
{
std::cerr << "Both parameters must be between 0 and 1, returning dummy value" << std::endl;
return 0.f;
}
//First guess for u
float u = x;
//Coefficients of curve (for x and y co-ord)
float x3 = 6 * p - 2;
float x2 = 3 - 9 * p;
float x1 = 3 * p;
float x0 = -x;

float y3 = 6 * (1-p) - 2;
float y2 = 3 - 9 * (1-p);
float y1 = 3 * (1-p);

//Newton-Raphson refinement
for(int i=0; fabs(x3*u*u*u + x2*u*u + x1*u + x0) > ITER_TOL && i<1000; i++)
{
u = u - (x3*u*u*u + x2*u*u + x1*u + x0) /
(3*x3*u*u + 2*x2*u + x1);
//std::cout << i << ": " << u << std::endl;
//Deal with non-convergence
if(i==999)
{
std::cerr << "Warning, Newton-Raphson method did not converge in Maths.cpp, returning dummy" << std::endl;
return 0.f;
}
}
//Calculate y co-ord
return y3*u*u*u + y2*u*u + y1*u;
}

如果我们设置 p = 0.5,我们应该得到一条直线,但是当我对一个 linspace 这样做时并绘制点,我得到 0.5 和 1.0 之间的弯曲。任何人都可以看出为什么会这样吗?如果有什么我可以做的?

最佳答案

我编译了您的代码并注意到循环仅运行 0 或 1 次迭代。可能是因为收敛检查中某处缺少fabs

关于c++ - 从三次贝塞尔曲线的 x 坐标获取 y,快速 Newton-Raphson 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9638353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com