我有一个List
个2D点。什么是迭代点的有效方式,以确定点列表是直线还是弯曲(以及到什么程度)。我想避免简单地在较小的子集之间获得斜率。我该怎么做呢?
感谢您的帮助
编辑:感谢您的回复。为了澄清,我不需要它在数值上准确,但我想确定用户是否用他们的鼠标创建了一个弯曲的形状,如果是这样,曲线是多么尖锐。这些值并不太重要,只要可以确定尖锐曲线和稍微柔和曲线之间的差异。
答案 0 :(得分:1)
要测试它是否是直线,请计算相关系数。我确信维基百科上有这个内容。
测试它是否更加复杂。你需要知道你期望的那种曲线,并且与之相符。
答案 1 :(得分:1)
如果你只是想知道 if 你的所有点或多或少都适合度d
的曲线,只需在端点上应用拉格朗日插值,从阵列内部d-2
等距离的点。这将为您提供度d
的多项式。
获得曲线后,只需遍历数组,看看每个点离曲线有多远。如果它们超过阈值,则您的数据不符合d
多项式。
编辑:我应该提一下,迭代d
的值是一个有限的过程。一旦d
达到你拥有的点数,你就会得到一个完美的契合,因为拉格朗日插值是如何工作的。
答案 2 :(得分:1)
以下是计算角度的方法:Calculate Angle between 2 points using C#
只需计算列表中每个点之间的角度并创建角度列表,然后比较角度列表值是否不同。如果它们没有不同则意味着它是直线,否则它就是曲线......
如果是直线,则所有点之间的角度必须相同。
答案 3 :(得分:0)
这里的问题非常模糊:“我想避免简单地在较小的子类之间获得斜坡”
您可能需要插值a-la B样条。如果记忆为我服务,他们会使用两个点和两个额外的控制点。从那时起(至少1980年代),实现无处不在。这应该让你开始
请记住,您可能需要添加控制点以使曲线符合端点。确保达到这些目标的一个技巧是简单地将端点复制为额外的控制点。
干杯
更新添加了codeproject的链接 看起来我在80年代记得的东西可能是Bezier曲线 - 各种各样的前身。