Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参数离散曲线的切线_C++_Qt_Math_Geometry - Fatal编程技术网

C++ 参数离散曲线的切线

C++ 参数离散曲线的切线,c++,qt,math,geometry,C++,Qt,Math,Geometry,我有一条参数曲线,比如说两个向量的双精度曲线,其中参数是索引,我必须计算在任何给定点(索引)与该曲线相切的角度 有没有关于如何做到这一点的建议或链接 谢谢。计算一阶导数:dy/dx。这将为您提供切线。您遇到的第一个问题是在曲线的一个顶点中定义切线。考虑一下,你有两个数组: x = { 1.0, 2.0, 2.0 }; y = { 1.0, 1.0, 2.0 }; 然后在第二个顶点,直线的方向发生90度的变化。在那个地方,切线甚至没有数学上的定义 下面是对gregseth评论的答复 我猜在你的例

我有一条参数曲线,比如说两个向量的双精度曲线,其中参数是索引,我必须计算在任何给定点(索引)与该曲线相切的角度

有没有关于如何做到这一点的建议或链接


谢谢。

计算一阶导数:dy/dx。这将为您提供切线。

您遇到的第一个问题是在曲线的一个顶点中定义切线。考虑一下,你有两个数组:

x = { 1.0, 2.0, 2.0 };
y = { 1.0, 1.0, 2.0 };
然后在第二个顶点,直线的方向发生90度的变化。在那个地方,切线甚至没有数学上的定义

下面是对gregseth评论的答复 我猜在你的例子中,第二点的“切线”应该是平行于(P0,P2)通过P1的线。。。哪一种给我答案:对于指数N的任何点,平行于(N-1,N+1)通过N。这是一个不太坏的近似值吗?
这取决于你使用它的目的。例如,考虑:

x = { 1.0, 2.0, 2.0 };
y = { 1.0, 1000000, 1000000 };
这基本上是一个L形,垂直线很高。在你的建议中,它会给你一个几乎垂直的切线。这就是你想要的,还是你更想要一个45度的切线?它还取决于您的输入数据以及您应该如何定义它


一种解决方案是将两个向量连接到顶点,对它们进行规格化,然后使用您的算法。这样,在上面的示例中,您将得到45度切线。

我建议您先检查一下。在此之前,请确定切线的用途,并确定是否需要尝试比本文中简单方案更复杂的方案。

您可以尝试计算通过给定点的插值曲线的切线(我正在考虑一个三次样条曲线,它非常容易推导)或者直接从数据点计算切线

可以通过以下方式找到导数的粗略近似值 让曲线C通过点p1、p2和p3。在点p2有两条可能的切线:t1=p2-p1和t2=p3-p2。只需计算它们的平均值即可将它们组合起来:0.5*(t1+t2) 或者您可以根据它们的长度(或它们的倒数1/长度)组合它们

请记住规范化生成的切线


为了计算切线和曲线之间的角度,请记住,两个单位向量的点积给出了它们之间角度的余弦。取得到的切线t和单位向量v2=| p3-p2 |,以及acos(点(t,v2))给出所需的角度。

点p处平滑曲线的切线是参数化直线p+tV,其中V是曲线相对于“参数”的导数。但这里参数只是数组的索引,数值微分是一个困难的问题,因此要近似我将使用的切线(加权)

换句话说,在你的兴趣点p周围选择三到五个曲线点(即p[i-2]、p[i-1]、p[i]、p[i+1]和p[i+2],如果p==p[i]),并在最小二乘意义上用一条直线近似它们。分配给中点P的权重越大,该线与P的距离越近;另一方面,分配给极值点的权重越大,越“相切”这条直线将,也就是说,在P附近,它将更精确地逼近你的曲线

例如,关于以下几点:

x = [-1, 0, 1]
y = [ 0, 1, 0]
未定义切线(如Anders Abel的回答中所述),
这种方法应该产生一条靠近点(0,1)的水平直线。

这里有一个简短的公式,与pau.estalella的答案相当(我认为):

m[i] = (y[i+1] - y[i-1]) / (x[i+1] - x[i-1])
这相当接近于点
(x[i],y[i])
处的斜率

你的问题提到了“切线的角度”。切线具有斜率
m[i]
,使角度
与正x轴成反正切(m[i])
。如果这是你想要的,你可以使用两个参数反正切,如果有:

angle[i] = atan2(y[i+1] - y[i-1], x[i+1] - x[i-1])

即使在
x[i+1]==x[i-1]

您的意思是切线和什么之间的角度?x轴?+1:OP需要澄清索引点处切线的定义我猜在您的示例中,第二点处的“切线”将是平行于(P0,P2)的线通过P1…哪种给我一个答案:对于平行于(N-1,N+1)通过N的指数N的任何点。这是一个不太坏的近似值吗?我喜欢这种方法,但我不确定是否能得到权重部分。我说得对吗,因为我只对切线上的斜率感兴趣(与X轴的角度)我不需要加权这些值?