【问题标题】:Polygon reduction while drawing on Map在地图上绘图时减少多边形
【发布时间】:2011-09-04 19:39:05
【问题描述】:

今天我们在 MKMapView 上绘制多边形。我们使用下面的伪代码来绘制多边形。

CGContextMoveToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextClosePath
CGContextFillPath

结果可能如下所示:

我们一次获取一行数据,根据我们收到的数据为单元格分配颜色。有没有一种方法或多边形减少算法可以将所有相同颜色的多边形组合在一起(假设它们相交)给我一个大多边形?所以在这个例子中,所有的红色都是一个大多边形。

【问题讨论】:

  • 你见过HazardMap 示例应用程序,它做类似的事情(虽然不是“多边形缩减”)?此外,如果所有路径都是矩形,使用 CGContextFillRect 代替当前代码可能会更快。
  • 我查看了危险地图。上面的例子有误导性,它们不是完美的 Rect,所以我需要使用上面的代码。如果我们单独执行每个缩放级别 18 的应用程序,则可能会渲染数百万个多边形,因此我们需要减少该数量以使其执行一半体面。

标签: objective-c polygon cgpath


【解决方案1】:

CoreGraphics 可以原生处理凹多边形,因此问题的主要部分是泛洪填充以计算填充区域的边界。

临时思考,一个简单的算法可能是将边缘标志与每个单元格相关联。如果边是多边形外部的一部分,则设置边标志。标志由在该边缘相遇的两个单元共享。

选择任何单元格并设置所有四个边缘标志。重置所有其他单元格上的边缘标志。然后编写一个递归方法,对于每个单元格:

  • 依次测试是否设置了每个边缘标志;
  • 如果设置了标志,则检查共享该边的单元格是否具有相同的颜色;
  • 如果是,则反转该单元格的边缘标志并递归到它。

反转与说“连接到您已知相邻的任何单元格,将位于我们尚未查看的单元格旁边的任何边缘设置为边界的一部分”相同。

递归可以深入数百个项目,因此保留一个要考虑的单元列表并将其添加到该列表而不是递归可能是值得的,这只是实现的问题。访问单元格的顺序无关紧要,因此结果应该是相同的。

一旦您用完了要访问的单元格,您就可以从任何标记的边缘绕过它来重建整个边界。唯一稍微复杂的是当您到达单元格的对角线会议时,例如黄色和绿色单元格在您的第四列和第五列之间接触的位置。您需要应用从当前边缘移动到下一个边缘的逻辑,与它共享一个顶点和一个正确颜色的单元格。

【讨论】:

    【解决方案2】:

    这是矩形绘制功能的工作,而不是路径绘制功能。请参阅 CGContextFillRect(), CGContextStrokeRect()CGContextFillRects()。它们会更快。

    【讨论】:

    • 在我的问题下方查看我的评论。我无法绘制和填充矩形,它们不是完美的矩形,尤其是在转弯处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多