我试图在其中心垂直翻转一个圆圈。 (按中心翻转圆圈看起来相同,以便我可以直观地检查)。但所取得的立场是完全错误的。我希望填充必须完全发生在描边区域内
circleRect = CGRect(x:100, y:100, width:100, height: 100)
override func draw(_ dirtyRect: CGRect) {
let ctx = NSGraphicsContext.current()!.cgContext
if(drawCircle) {
let path = getOvalPath(circleRect) //returns a oval cgpath for the rect, here the rect is a square so it gives a circle
//stroked without flipping
ctx.addPath(path)
ctx.setStrokeColor(CGColor.black)
ctx.strokePath()
//filled with flipping
ctx.saveGState
ctx.translateBy(x: 0, y: circleRect.size.height)
ctx.scaleBy(x: 1, y: -1)
ctx.addPath(path)
ctx.setFillColor(fillColor)
ctx.fillPath()
ctx.restoreGState()
}
drawCircle = true
setNeedsDisplay(circleRect)
答案 0 :(得分:1)
你的圈子中心位于(100,100)。考虑转换对这一点的影响:
var point = CGPoint(x: 100, y: 100)
// point = (100, 100)
point = point.applying(CGAffineTransform(scaleX: 1, y: -1))
// point = (100, -100)
point = point.applying(CGAffineTransform(translationX: 0, y: 100))
// point = (100, 0)
所以你的变形会移动圆圈的中心。
你正在考虑“翻转”y轴,将它从一些“画布”的左下角移动到左上角。如果它在画布上垂直居中,那么它将保持不变。你的画布高度由你应用的y平移隐含定义,即100。所以你的画布高度为100,这意味着圆圈的中心需要在y = 100/2 = 50才能保持不变。
由于你的圆圈的中心位于y = 100,你需要使用2 * 100 = 200的画布高度来保持圆形。