在地图上绘制时缩小多边形

时间:2011-09-04 19:39:06

标签: objective-c polygon cgpath

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

CGContextMoveToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextClosePath
CGContextFillPath

结果可能看起来像这样:

data table

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

反演与说“连接到你知道的下一个单元格相同,设置我们尚未看到的单元格旁边的任何边缘都是边界的一部分”。

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

一旦你的细胞耗尽,你可以通过从任何标记的边缘走动来重建整个边界。当你进入细胞的对角线会议时,唯一的一点是复杂性,例如黄色和绿色细胞在第四和第五列之间接触的位置。您需要应用从当前边缘移动到下一个逻辑的逻辑,它与它共享一个顶点和正确颜色的单元格。

答案 1 :(得分:0)

这是矩形绘制函数的作业,而不是路径绘制函数。请参阅CGContextFillRect(), CGContextStrokeRect()CGContextFillRects()。它们会快得多。