为 iOS 创建矩阵堆栈:将矩阵重置为恒等式
Creating a Matrix Stack for iOS: Resetting Matrix to Identity
我正在使用 Apple 的 Core Graphics 框架并尝试实现一个推入和弹出矩阵,以使用堆栈结构隔离和封装对当前转换矩阵 (ctm) 的更改。
这对于 Core Graphics 的 .saveGState()
和 .restoreGState()
是外部的,原因是 .saveGState()
和 .restoreGState()
推送和弹出不仅仅是ctm,我想为我的 API/package 用户提供在推送和弹出时分离样式和矩阵的选项。
我想实施的流程是:
pushMatrix()
- 将 ctm 添加到堆栈。
- 对 ctm 进行任何缩放、平移、旋转或自定义仿射变换的应用。
popMatrix()
- 将当前 ctm 更改回上次推送的状态。
这是我当前使用的代码(为简洁起见减去了堆栈代码):
public func resetMatrixToIdentity() {
let inverted = context?.ctm.inverted()
context?.ctm.concatenating(inverted!)
}
open func pushMatrix() {
let currentTransformation = (context?.ctm)!
matrixStack.push(matrix: currentTransformation)
}
open func popMatrix() {
resetMatrixToIdentity()
context?.ctm.concatenating(matrixStack.pop()!)
}
我遇到的问题是这段代码目前根本不影响 CTM,所以我想知道我对 Core Graphics 或矩阵乘法中的 CTM 有什么误解。
我知道这个 previous post 并尝试在我的代码中应用这些见解,但它似乎不起作用。
这是一个非常简单的修复,所以我会回答我自己的问题,以防其他人也犯这个错误。
上下文的 ctm 属性 是只获取的。为了使用串联设置 ctm,我正在尝试:
context?.ctm.concatenating(inverted!)
这是不正确的。 Core Graphics用来连接的函数实际上是:
context?.concatenate(inverted!)
一旦我替换了它,一切都按预期工作了。
我正在使用 Apple 的 Core Graphics 框架并尝试实现一个推入和弹出矩阵,以使用堆栈结构隔离和封装对当前转换矩阵 (ctm) 的更改。
这对于 Core Graphics 的 .saveGState()
和 .restoreGState()
是外部的,原因是 .saveGState()
和 .restoreGState()
推送和弹出不仅仅是ctm,我想为我的 API/package 用户提供在推送和弹出时分离样式和矩阵的选项。
我想实施的流程是:
pushMatrix()
- 将 ctm 添加到堆栈。- 对 ctm 进行任何缩放、平移、旋转或自定义仿射变换的应用。
popMatrix()
- 将当前 ctm 更改回上次推送的状态。
这是我当前使用的代码(为简洁起见减去了堆栈代码):
public func resetMatrixToIdentity() {
let inverted = context?.ctm.inverted()
context?.ctm.concatenating(inverted!)
}
open func pushMatrix() {
let currentTransformation = (context?.ctm)!
matrixStack.push(matrix: currentTransformation)
}
open func popMatrix() {
resetMatrixToIdentity()
context?.ctm.concatenating(matrixStack.pop()!)
}
我遇到的问题是这段代码目前根本不影响 CTM,所以我想知道我对 Core Graphics 或矩阵乘法中的 CTM 有什么误解。
我知道这个 previous post 并尝试在我的代码中应用这些见解,但它似乎不起作用。
这是一个非常简单的修复,所以我会回答我自己的问题,以防其他人也犯这个错误。
上下文的 ctm 属性 是只获取的。为了使用串联设置 ctm,我正在尝试:
context?.ctm.concatenating(inverted!)
这是不正确的。 Core Graphics用来连接的函数实际上是:
context?.concatenate(inverted!)
一旦我替换了它,一切都按预期工作了。