我正在编写一个贝塞尔曲线库。我已经可以将曲线计算为给定分辨率的连接点的集合,但我现在需要执行相反的操作;检测给定点是否在给定公差范围内的曲线上(例如0.0001
)。 有一个简单的数学函数可以做到这一点吗?
请以函数的形式表述您的答案,该函数接受三个参数:x
和 y
坐标以及公差(与曲线的距离仍被视为“on”) it),并输出一个 bool 值。这将使其对其他人更加有用。例如,Swift 中的此类函数的签名为 func isOnCurve(x: Float, y: Float, Tolerance: Float) -> Bool
最佳答案
您可以利用https://pomax.github.io/bezierinfo/#projections中描述的“曲线距离”方法。 ,但这会找到一个 t
任意坐标的值。对于“这个点在曲线上吗?”检查一下,没问题(多个 t
值不会改变答案;0 为曲线外,1 为曲线上,2 个或更多仍为曲线上)。
在 t
的几个(相对接近的)值处对曲线进行采样(我假设为了提高效率,您已经这样做了,以便只计算绘制坐标一次,而不是每次需要绘制曲线时都计算),然后使用最接近的 t
产生,开始沿着曲线行走,减少距离,直到找到最小距离(如何行走取决于你:你可以进行从粗到细的行走,或者从精细开始,或者确定跳跃多远基于曲线切线等)。
那么你的结果实际上就是 return minDistance <= tolerance
.
关于contains - 如何判断一个点是否在给定公差范围内的二次贝塞尔曲线上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029616/