0

我想通过AndroidSVG库在 Android 中渲染我的 svg(但我愿意使用其他解决方案)。接收到 Touchevent 时,我想计算触摸事件与给定 svg 元素之间的距离。特别是一个<svg:g id:"myElement">元素。该元素又包含了一群<svg:path ...>孩子。

目前我不知道如何完成这项任务。即使默认情况下没有可用的库支持此功能,如果有人能指出我可以实现的算法,我将不胜感激。

4

1 回答 1

1

组元素没有自己的形状。所以你必须看看它的内容。

如果组元素有一些变换,您可以将此变换应用于每个子元素,或者将反向操作应用于当前鼠标位置。在后一种情况下,您必须对最终结果进行一些校正,因为距离将在转换后的坐标中,因此您必须将其恢复为未转换的坐标。

有几种方法可以定义路径的形状,每种定义都会产生不同的距离度量。从快速但粗略到缓慢但准确的顺序,我能想到的选项是

  1. 轴对齐的边界框。只需取所有点,包括 Bézier 控制点,然后取每个坐标的最小值和最大值。这定义了一个边界矩形,您可以计算到它的距离。
  2. 凸壳。取所有点,同样包括控制点,并计算这些点的凸包。路径将包含在该船体中。计算到那个的距离。
  3. 点云。取所有点,可能再次包括控制点,但可能不包括,并找到最接近我们输入的点。使用到那个的距离。
  4. 分段线性。忽略控制点,但将您的路径视为一系列线段。计算到每个的距离,然后取最小值。
  5. 平坦的路径。使用 De Casteljau 算法通过分段线性路径逼近曲线路径,直到满足一些误差界限,然后按照上述方法进行操作。
  6. 数学上精确。查看每个曲线段,并实际计算最小距离。为此,您需要找到曲线的切线与朝向输入点的矢量正交的点。对于Math SE 而言,这本身就是一个问题,但请在发布之前进行搜索。
于 2014-09-09T11:42:33.857 回答