我希望确定一个点(鼠标位置)何时在由一系列 B 样条控制点定义的曲线上或附近。
我将获得的 B 样条信息是 n 个控制点的列表(在 x,y 坐标中)。控制点列表可以是任意长度 (>= 4) 并定义由 (n-1)/3 个三次贝塞尔曲线组成的 B 样条。贝塞尔曲线都是三次方的。我希望设置一个参数 k,(以像素为单位)定义为“接近”曲线的距离。如果鼠标位置在曲线的 k 像素内,则我需要返回 true,否则返回 false。
有没有一种算法可以给我这个信息。任何解决方案都不需要精确 - 我正在努力达到 1 个像素(或坐标)的容差。
我发现以下问题似乎提供了一些帮助,但不回答我的确切问题。特别是第一个参考似乎是仅适用于 4 个控制点的解决方案,并且没有考虑我希望定义的接近因子。
编辑:一个示例曲线:
e, 63.068, 127.26
29.124, 284.61
25.066, 258.56
20.926, 212.47
34, 176
38.706, 162.87
46.556, 149.82
54.393, 138.78
格式的描述是:“每条边都分配有一个 pos 属性,它由 3n + 1 个位置的列表组成。这些是 B 样条控制点:点 p0、p1、p2、p3 是第一个贝塞尔样条,p3 , p4, p5, p6 是第二个等。点用逗号分隔的两个整数表示,表示以点(1/72 英寸)为单位指定位置的 X 和 Y 坐标。在 pos 属性中,控制点列表前面可能有一个起点 ps 和/或一个终点 pe。它们具有通常的位置表示,分别带有“s”或“e”前缀。
EDIT2:进一步解释“e”点(如果存在s)。
在 pos 属性中,控制点列表的前面可能有一个起点 ps 和/或一个终点 pe。它们具有通常的位置表示,分别带有“s”或“e”前缀。如果 p0 处有箭头,则存在起点。在这种情况下,箭头是从 p0 到 ps,其中 ps 实际上在节点的边界上。箭头的长度和方向由向量 (ps -p0) 给出。如果没有箭头,则 p0 在节点的边界上。类似地,点 pe 表示边缘另一端的箭头,连接到最后一个样条点。