Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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#_Math_2d_Points_Curve - Fatal编程技术网

C# 从点获取曲线细节

C# 从点获取曲线细节,c#,math,2d,points,curve,C#,Math,2d,Points,Curve,我有一个2D点的列表。迭代点以确定点列表是直线还是曲线(以及达到何种程度)的有效方法是什么。我希望避免在较小的子集之间获得坡度。我该怎么做呢 谢谢你的帮助 编辑:谢谢你的回复。为了澄清,我不需要精确到数字,但我想确定用户是否用鼠标创建了曲线形状,如果是,曲线有多尖锐。这些值并不太重要,只要有可能确定尖锐曲线和稍软曲线之间的差异。这里的问题非常模糊:“我希望避免在较小的子段之间获得坡度。” 您可能需要插值a-la B样条曲线。如果我记性好的话,他们会使用两个点和两个额外的控制点。自20世纪80年代

我有一个2D点的
列表。迭代点以确定点列表是直线还是曲线(以及达到何种程度)的有效方法是什么。我希望避免在较小的子集之间获得坡度。我该怎么做呢

谢谢你的帮助


编辑:谢谢你的回复。为了澄清,我不需要精确到数字,但我想确定用户是否用鼠标创建了曲线形状,如果是,曲线有多尖锐。这些值并不太重要,只要有可能确定尖锐曲线和稍软曲线之间的差异。

这里的问题非常模糊:“我希望避免在较小的子段之间获得坡度。”

您可能需要插值a-la B样条曲线。如果我记性好的话,他们会使用两个点和两个额外的控制点。自20世纪80年代以来,实现无处不在。这应该会让你走上正轨

请记住,可能需要添加控制点以使曲线与端点相交。确保达到这些目标的一个技巧是简单地将端点复制为额外的控制点

干杯

更新将链接添加到
看来我在80年代所记得的可能是贝塞尔曲线——某种类型的前身。

要测试它是否是一条直线,请计算相关系数。我相信维基百科上也有这方面的内容


测试它是否是弯曲的更复杂。你需要知道你想要什么样的曲线,并根据这些曲线进行拟合。

如果你只想知道如果你的所有点或多或少都适合度
d
的曲线,只需在端点和
d-2
数组内等间距的点上应用拉格朗日插值。这将为您提供一个次为
d
的多项式

获得曲线后,只需在阵列上迭代,查看每个点离曲线的距离。如果它们超过阈值,则数据不符合度数
d
多项式


编辑:我应该提到迭代
d
的值是一个有限的过程。一旦
d
达到你拥有的点数,你就会得到一个完美的拟合,因为拉格朗日插值是如何工作的。

这里有一个计算角度的方法:

只需计算列表中每个点之间的角度并创建角度列表,然后比较角度列表值是否不同。如果它们没有区别,那么这意味着它是直线,否则它是曲线


如果它是一条直线,那么所有点之间的角度必须相同。

我总是需要3个点来计算角度。点1=x1,y1点2=x2,y2-你可以计算这两点之间的夹角,我的数学不好:-)这个解决方案是我第一个想到的,它对我来说有一些逻辑/意义,而不需要使用一些复杂的公式。