objective-c - 在 map 上绘制时减少多边形

标签 objective-c polygon cgpath

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

CGContextMoveToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextClosePath
CGContextFillPath

结果可能如下所示:

data table

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

最佳答案

CoreGraphics 本身可以处理凹多边形,因此问题的主要部分是用泛洪填充来确定填充区域的边界。

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

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

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

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

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

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

关于objective-c - 在 map 上绘制时减少多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301670/

相关文章:

ios - SKSpriteNode 不受自定义 physicsBody 的重力影响

ios - 整体加入了UIBezierPath笔画

swift - 如何检测cgRect中的cgPath

iphone - 在应用程序版本等之间访问 CoreData 实体

iphone - 做一个小型开源iOS API时,ARC用户和非ARC用户如何计算

objective-c - Objective C 习语 - 属性、ivars 和 needsDisplay

css - 填充 svg 多边形形状的一半 - 星形

objective-c - 检查对象是否符合 Objective-C 中的两个独立协议(protocol)

r - R中折线图下方的阴影

size - 检查用Leaflet l.draw.polyline绘制的多边形的大小