我有一个List
二维点。什么是遍历点以确定点列表是直线还是弯曲(以及弯曲程度)的有效方法。我想避免简单地在较小的子集之间获得斜率。我该怎么做呢?
谢谢你的帮助
编辑:感谢您的回复。为了澄清,我不需要它在数字上是准确的,但我想确定用户是否用他们的鼠标创建了一个弯曲的形状,如果是,那么曲线有多尖锐。这些值并不太重要,只要可以确定尖锐曲线和稍微柔和的曲线之间的差异即可。
要测试它是否是一条直线,请计算相关系数。我确定这在维基百科中有所介绍。
测试它是否弯曲更复杂。你需要知道你期望什么样的曲线,并与之相适应。
如果您只是想知道您的所有点是否或多或少适合度数曲线,只需在数组内部的端点和等距点d
上应用拉格朗日插值。d-2
这将为您提供 degree 的多项式d
。
一旦你有了你的曲线,只需遍历数组,看看每个点离曲线有多远。如果它们比阈值更远,则您的数据不适合您的度d
多项式。
编辑:我应该提到迭代的值d
是一个有限的过程。一旦d
达到您拥有的点数,由于拉格朗日插值的工作原理,您将获得完美的拟合。
这是一种计算角度的方法:Calculate Angle between 2 points using C#
只需计算列表中每个点之间的角度并创建角度列表,然后比较角度列表值是否不同。如果它们没有不同,则表示它是直线,否则它是曲线......
如果它是一条直线,那么所有点之间的角度必须相同。
这里的问题真的很模糊:“我想避免简单地在较小的substes之间获得斜坡”
您可能想要插值 a-la B 样条。如果记忆对我有用,他们会使用两个点和两个额外的控制点。自很久以前(至少 1980 年代)以来,实现无处不在。这应该让你开始
请记住,您可能需要添加控制点以使曲线与端点相交。确保达到这些目标的一个技巧是简单地将端点复制为额外的控制点。
干杯
更新添加了指向codeproject的链接, 看来我在 80 年代记得的可能是贝塞尔曲线——某种前身。