所以我对SVG坐标系有点困惑。我正在做一个将SVG对象转换为多边形的项目(然后在OpenGL中显示)。我有所有代码,包括rects,圆圈,路径(带曲线近似)等,并将它们转换为每个对象的一组点。到目前为止,这一切都很有效。
我现在正处于实施转型的阶段。我已经编写了所有矩阵函数并准备好了,但我对translate(x,y)和任何以0,0为中心的操作(主要是旋转和缩放)之间的关系感到困惑。
所以假设我们在0,0处有一个对象。 rotate(45, 100, 100)
相当于translate(100, 100) rotate(45) translate(-100, -100)
,但是如果我将对象移动到100,100并且旋转仍然应用于0,0并不意味着旋转中心实际发生在-100, - 100相对于物体的原始位置?
我想我的问题是translate
如何影响对象的坐标系?似乎在某些情况下,它用于将0,0移动到指定的点而不移动对象,而在其他情况下,它用于移动对象。
我对坐标系的理解是否完全有缺陷?
答案 0 :(得分:5)
我认为SVG specification非常清楚地解释了coordinate transformations。每次转换都意味着将当前坐标与3x3矩阵相乘。您可以在transform
attribute中指定的最通用转换是自定义matrix(...)
,而所有其他类型的转换(转换,旋转,缩放,倾斜)都是易于使用的快捷方式。最后,一切都以矩阵结束。
组合几个变换很简单,它只是意味着每个变换矩阵按顺序与其他变换相乘,并且跟踪所有变换意味着只记住从此乘法获得的最终3x3矩阵,并计算最终坐标元素意味着将初始坐标的3x1矩阵与3x3矩阵相乘。
所以,我的建议是只使用矩阵而忘记手动应用每个转换。