C# 从点获取曲线细节
我有一个2D点的C# 从点获取曲线细节,c#,math,2d,points,curve,C#,Math,2d,Points,Curve,我有一个2D点的列表。迭代点以确定点列表是直线还是曲线(以及达到何种程度)的有效方法是什么。我希望避免在较小的子集之间获得坡度。我该怎么做呢 谢谢你的帮助 编辑:谢谢你的回复。为了澄清,我不需要精确到数字,但我想确定用户是否用鼠标创建了曲线形状,如果是,曲线有多尖锐。这些值并不太重要,只要有可能确定尖锐曲线和稍软曲线之间的差异。这里的问题非常模糊:“我希望避免在较小的子段之间获得坡度。” 您可能需要插值a-la B样条曲线。如果我记性好的话,他们会使用两个点和两个额外的控制点。自20世纪80年代
列表。迭代点以确定点列表是直线还是曲线(以及达到何种程度)的有效方法是什么。我希望避免在较小的子集之间获得坡度。我该怎么做呢
谢谢你的帮助
编辑:谢谢你的回复。为了澄清,我不需要精确到数字,但我想确定用户是否用鼠标创建了曲线形状,如果是,曲线有多尖锐。这些值并不太重要,只要有可能确定尖锐曲线和稍软曲线之间的差异。这里的问题非常模糊:“我希望避免在较小的子段之间获得坡度。”
您可能需要插值a-la B样条曲线。如果我记性好的话,他们会使用两个点和两个额外的控制点。自20世纪80年代以来,实现无处不在。这应该会让你走上正轨
请记住,可能需要添加控制点以使曲线与端点相交。确保达到这些目标的一个技巧是简单地将端点复制为额外的控制点
干杯
更新将链接添加到
看来我在80年代所记得的可能是贝塞尔曲线——某种类型的前身。要测试它是否是一条直线,请计算相关系数。我相信维基百科上也有这方面的内容
测试它是否是弯曲的更复杂。你需要知道你想要什么样的曲线,并根据这些曲线进行拟合。如果你只想知道如果你的所有点或多或少都适合度d
的曲线,只需在端点和d-2
数组内等间距的点上应用拉格朗日插值。这将为您提供一个次为d
的多项式
获得曲线后,只需在阵列上迭代,查看每个点离曲线的距离。如果它们超过阈值,则数据不符合度数d
多项式
编辑:我应该提到迭代d
的值是一个有限的过程。一旦d
达到你拥有的点数,你就会得到一个完美的拟合,因为拉格朗日插值是如何工作的。这里有一个计算角度的方法:
只需计算列表中每个点之间的角度并创建角度列表,然后比较角度列表值是否不同。如果它们没有区别,那么这意味着它是直线,否则它是曲线
如果它是一条直线,那么所有点之间的角度必须相同。我总是需要3个点来计算角度。点1=x1,y1点2=x2,y2-你可以计算这两点之间的夹角,我的数学不好:-)这个解决方案是我第一个想到的,它对我来说有一些逻辑/意义,而不需要使用一些复杂的公式。