C++ 使用c++;

C++ 使用c++;,c++,opengl,point,bezier,curve,C++,Opengl,Point,Bezier,Curve,所以我有一个有4个控制点的程序 std::vector<ControlPoint> cam_pos_points; cam_pos_points.push_back(ControlPoint(-0.79, 0.09, 0.2, 0)); cam_pos_points.push_back(ControlPoint(-0.88, -0.71, 0.2, 1)); cam_pos_points.push_back(ControlPoint(1.3, -0.8, 0.

所以我有一个有4个控制点的程序

std::vector<ControlPoint> cam_pos_points;
    cam_pos_points.push_back(ControlPoint(-0.79, 0.09, 0.2, 0));
    cam_pos_points.push_back(ControlPoint(-0.88, -0.71, 0.2, 1));
    cam_pos_points.push_back(ControlPoint(1.3, -0.8, 0.2, 2));
    cam_pos_points.push_back(ControlPoint(0.71, 0.76, 0.2, 3));

起点切线将从第一个控制点到第二个控制点,终点切线将从第四个控制点到第三个控制点。我建议你每次重画时都要重新开始;i、 例如,当控制点移动时,将其视为一个全新的方程式

如果一条(或两条)切线的长度均为零,则它们本身实际上不是切线,但曲线将朝向相反的端点


这就是为什么可以使用没有切线的贝塞尔截面来表示直线。

公式是错误的

正确的公式是

(1-t)^3 * p0 + 3*(1-t)^2*t * p1 + 3*(1-t)*t^2 * p2 + t^3 * p3. 

展开并微分以获得切线。

看起来您希望在Bezier曲线的起点和终点绘制切线向量的切线点,以便用户可以通过移动切线点来调整曲线的形状。如果是这种情况,则需要注意,移动切线点也会移动第二个或第三个控制点。因此,正确的程序是从移动的切线点重新计算第二个或第三个控制点,然后重新绘制曲线

对于三次贝塞尔曲线,t=0和1处的C'(t)为

C'(0)=3*(P1-P0)
C'(1)=3*(P3-P2)

假设起始切线的切点为T0,位于

T0=P0+s0*C'(0)=P0+3*s0*(P1-P0)

其中s0是一个恒定比例因子,用于确保切点不会离控制点太远。当T0更改为T0*时,可以将控制点P1更新为

P1*=(T0*-P0)/(3*s0)+P0


移动端点切线的切点时,对控制点P2执行类似更新。然后,您可以重新绘制曲线。

这就是我对控制点所做的。每次移动控制点时,都会重新计算整个曲线。对于切线,移动切点时,我希望在不移动任何控制点的情况下调整曲线的角度或形状。我遇到的问题是,在计算完曲线后,我要确定切线的位置,所以移动切线不会起任何作用。我可以用切线点来计算曲线,这样我可以在移动切线时重新计算它吗?当你说展开和微分时,你的意思是只取方程的导数,插入某些t值,就能得到切线吗?所以我找到了方程的导数,但我不知道怎么处理它。数字是一个位置还是一个方向?如果它是一个方向,我怎样才能将它变成一个可以修改的控制点?没错。展开,得到两个三次方程,一个在x,一个在y,t为自变量。取dx/dt和dy/dt,用初等演算得到两个二次方程,然后插入t,得到给定t点的切线方向。那么控制点与切线是否不同?人们说要找到切线,你必须计算导数,这让我觉得它不同于控制点,但是如果你也移动控制点,移动切线,移动切线和移动控制点之间有什么区别吗?或者切线只是移动控制点的一种更简单的方法吗?@OP:三次贝塞尔曲线由4个控制点表示。因此,它的一阶导数(或切线)也可以用这4个控制点来表示。所以移动切线只是移动相应控制点的间接方式。为什么使用
pow
而不是直接计算<代码>浮动mt=1-t,t2=t*t,mt2=mt*mt,t3=t2*t,mt3=mt2*mt然后使用这些。剃掉头顶上的胡子。注意:我不知道你在计算什么,但它不是贝塞尔曲线。三次贝塞尔曲线的形式为
A*(t-1)^3+b*3*t*(t-1)^2+c*3*(t-1)*t^2+d*t^3
,其中A、b、c和d是您的坐标。继续阅读前几节,确保你的数学正确。现在:你没有。
float dx = (-3*(pow((1 - t), 2)) * cam_pos_points[0].positionx()) + 
             (((-2*(1 - t)) * t) * cam_pos_points[1].positionx()) + 
              (((1 - t) * (2*t)) * cam_pos_points[2].positionx()) + 
                  ((3*pow(t, 2)) * cam_pos_points[3].positionx());

float dy = (-3*(pow((1 - t), 2)) * cam_pos_points[0].positiony()) + 
             (((-2*(1 - t)) * t) * cam_pos_points[1].positiony()) + 
              (((1 - t) * (2*t)) * cam_pos_points[2].positiony()) + 
                  ((3*pow(t, 2)) * cam_pos_points[3].positiony());
(1-t)^3 * p0 + 3*(1-t)^2*t * p1 + 3*(1-t)*t^2 * p2 + t^3 * p3.