【发布时间】:2018-06-22 17:48:23
【问题描述】:
我正在尝试绘制国家并用某种颜色填充内部。我的数据源是一个TopoJSON 文件,简而言之,它由引用弧形数组以创建形状的形状组成。我将其转换为paths 的数组,然后我遍历它以绘制国家。正如您在下面的屏幕截图中看到的那样,我正在绘制国家(阿富汗)轮廓的正确线条。
但是,当我尝试使用 path.fill() 时,我最终得到以下结果。注意黑线是如何正确的,但颜色却随意地在外面和里面。
代码
var mapRegion = MapRegion()
var path = mapRegion.createPath()
var origin: CGPoint = .zero
geometry.paths
.enumerated()
.forEach { (geoIndex, shape) in
shape
.enumerated()
.forEach { (shapeIndex, coord) in
guard let coordPoint = coord.double else { return }
let values = coordinatesToGraphics(x: coordPoint.x, y: coordPoint.y)
let point = CGPoint(x: values.x, y: values.y)
if origin == .zero {
origin = point
}
// Shape is about to be closed
if shapeIndex != 0 && path.contains(point) {
// Close, save path (2)
path.addLine(to: origin)
// (3) path.close()
mapRegion.savePath()
// Add to map, reset process
canvas.layer.addSublayer(mapRegion)
mapRegions.append(mapRegion)
mapRegion = MapRegion()
path = mapRegion.createPath()
}
else {
if shapeIndex == 0 {
path.move(to: point)
} else {
path.addLine(to: point)
}
}
}
}
我已经尝试过彻底弄乱usesEvenOddFillRule (further reading),但没有任何改变。我发现上面的评论 (1) 有助于解决一个不应该绘制边界的问题。 (2) 处的函数savePath() 运行setStroke()、stroke()、setFill()、fill() 函数。
更新:path.close() 在形状的左下角绘制一条线来闭合路径,而不是在它第一次开始绘制的左上角。该函数关闭“最近添加的子路径”,但是如何定义子路径?
我不能确定问题是我的逻辑还是某些 CoreGraphics 技巧。我有一系列路径,我需要将它们缝合在一起并视为一个路径,我相信我正在这样做。我查看了数据点,一个弧的结束到下一个弧的开始是相同的。我打印了我缝合在一起的路径,我基本上move(to:) 同一点,所以当我addLine(to:) 时没有重复查看模拟器为区域着色的方式,我首先猜测可能个别弧被视为形状,但在这个例子中只有 6 个圆弧,还有几个内外颜色切换。
我真的很感谢这里的任何帮助!
【问题讨论】:
-
您是否尝试过直接向
path添加行而不是创建许多单独的路径?在这种方法中,您只需要使用 move 来移动到原点(而不是像您目前所做的那样为每个形状移动一次)。 -
我正朝着那个方向前进。有时路径可能是一个区域的一部分,所以我正在制作一种机制来检查路径何时返回起点,然后将其关闭并填充它。
-
@featherless 我现在只创建一条路径,并且得到相同的结果:/
-
更新后的代码是什么样的?
-
下面。我明白了!
标签: swift core-graphics uibezierpath topojson