【问题标题】:Finding Area that CGPath Intersects CGRect查找 CGPath 与 CGRect 相交的区域
【发布时间】:2012-06-01 10:02:01
【问题描述】:

我正在开发一个 iOS 应用程序,我需要能够查看屏幕边界内的 CGPath 有多少,以确保有足够的空间供用户触摸。问题是,当形状在拐角处时,当路径在拐角处时,我通常会使用的所有方法(以及我能想到的所有方法)都会失败。

这是一张照片:

如何计算该形状在屏幕上的数量?

【问题讨论】:

  • 您到底在寻找什么?您想测量重叠的面积(以平方点为单位)吗?或者你想要一个只包含重叠的路径或蒙版?还是别的什么?
  • CGPath是完全通用的,还是保证是多边形,如图所示?
  • @robmayoff 如果可能的话,我想用平方点来测量面积。
  • @Tommy 我不确定你所说的“完全一般”是什么意思,但我使用图片中的多边形来说明一个非常奇怪的形状,这些形状永远都是。
  • @daveMac 从某种意义上说,CGPath 可能有弧线、贝塞尔曲线和一堆其他东西,而不仅仅是一个多边形。然而,一个多边形——即使不一定是凸面的,甚至不是简单的——相对容易剪裁成一个矩形,这可能是解决方案的一部分。

标签: ios quartz-graphics quartz-2d bounding-box cgpath


【解决方案1】:

显而易见的答案是通过像素绘制凭经验进行,或通过多边形裁剪以分析方式进行。

因此,要凭经验进行操作,您需要创建一个视口大小的CGBitmapContext,将其清除为已知颜色,例如 (0, 0, 0),然后以另一种已知颜色在多边形上绘制,例如 (1 , 1, 1) 然后遍历位图上下文中的所有像素,并将您可以找到的总数相加。这可能非常昂贵,但如果有帮助,您可以使用较低分辨率的上下文来获得更近似的结果。

要继续进行分析,您将运行多边形裁剪算法,例如 described here,以从原始多边形派生一个新多边形,这只是它实际在屏幕上的那部分。然后,您可以使用任何常规公式获得该区域。

裁剪凸多边形实际上比裁剪凹多边形要容易得多,因此如果您的多边形是固定形状的,那么您可以考虑使用三角剖分算法,例如 ear clippingdecomposition to monotone edges 然后执行裁剪和那些而不是原来的面积计算。

【讨论】:

    【解决方案2】:

    您可以使用这种方法得到一个近似值:

    • 设 reg 为屏幕与形状边界框的交点
    • 在reg中随机选择N个点,检查是否包含在shape中
    • 形状的面积可以通过(reg的面积)*(形状中包含的点数)/N来估计

    您可以根据reg的大小选择参数N以获得良好且快速的近似

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      相关资源
      最近更新 更多