我对“坐标变换矩阵”的格式感到非常困惑(尤其是它的数学定义和“X 服务器定义”之间的差异),由于缺乏信息来源,我需要在这里问几个问题,希望能澄清一些事情。
- 最初我以为“坐标变换矩阵”只是点之间的简单映射,其定义与数学中使用的/维基百科等提供的定义完全相同。我认为它的应用就像“取矩阵和输入点,将它们相乘并得到输出点”一样简单。本网站上的“使用坐标变换矩阵”部分:
https://wiki.ubuntu.com/X/InputCoordinateTransformation
似乎用一个例子来支持我最初的理论,该例子展示了一个点(400,197)
与单位矩阵相乘得到相同的点,但除了这个简单的例子之外,事情不可能那么简单。如果乘法得出的点的坐标为负数怎么办?虽然它在数学上是精确的,并且在标准笛卡尔坐标系中工作正常,但计算机屏幕上的点永远不会有负坐标,那么 X 服务器如何处理/转换这样的负值?一个简单的例子:很容易看出,取自上述网站的“使用坐标变换矩阵”部分的 90 度旋转矩阵(顺便说一句:为什么他们将左旋转称为“顺时针 90 度”,而将右旋转称为“逆时针 90 度”,应该是相反的,对吧?)将点映射(x,y)
到点(-y+1,x)
,这似乎完全是胡说八道,因为对于每个大于 1 的 y,结果点的第一个坐标都是负的。显然,一定存在某种内部转换/规范化,但我找不到任何资料来解释整个过程是如何“在幕后”工作的以及它会产生什么最终结果。
- “平移分量”对于旋转矩阵有什么意义?例如,左旋转在数学上可以用
"0 -1 0 1 0 0 0 0 1"
矩阵(行主序)表示,而对于 X 服务器/xinput 等,左旋转可以用"0 -1 1 1 0 0 0 0 1"
矩阵表示,该矩阵在数学上对应于左旋转后跟矢量平移[1,0]
。我能找到的关于这个主题的唯一参考资料是 libinput 参考网站上的以下引文:
“翻译组件需要规范化到设备坐标范围”
这句话至少可以说是含糊不清的,对我来说根本解释不了什么。您能否提供一些示例,说明旋转的转换过程究竟是如何进行的,以及旋转的“数学定义”和“X 服务器定义”有何不同?
- 一些网站将“坐标变换矩阵”的一般形式描述为具有以下元素的矩阵:
"a 0 c 0 e f 0 0 1"
在哪里:
a = touch_area_width / total_width
c = touch_area_x_offset / total_width
e = touch_area_height / total_height
f = touch_area_y_offset / total_height
这是“官方”定义吗?这似乎再次与变换矩阵的数学定义有很大不同,并导致了一些令人惊讶的结果。例如:我们有 N 个相同的显示器垂直堆叠,底部显示器上连接着一个触摸屏。现在,我们希望触摸屏的坐标能够正确映射到它所连接的显示器上。直观地说,(x,y)
触摸屏上的点应该映射到(x,(N-1)*MONITOR_HEIGHT+y)
由所有显示器组成的虚拟屏幕上的点(x
坐标保持不变,而坐标y
必须增加高度乘以最后一个显示器上方的所有显示器)。但是,当我们遵循上述a
、c
和系数的定义时,结果完全不同。在我们的例子中,对于垂直排列的 N 个相同显示器:e
f
a = touch_area_width / total_width = 1
c = touch_area_x_offset / total_width = 0
e = touch_area_height / total_height = 1/N
f = touch_area_y_offset / total_height = (N-1)/N
因此,结果矩阵是"1 0 0 0 1/N (N-1)/N 0 0 1"
,它将点映射(x,y)
到(x,(y/N + (N-1)/N))
,这显然是不同的结果。对于 N=2,前一个变换映射(x,y)
到 ,(x,MONITOR_HEIGHT+y)
而后一个变换映射(x,y)
到 ,(x,(0.5*y + 0.5))
这似乎绝对违反直觉,因为结果点的第二个坐标根本不取决于显示器的数量。我的推理有什么问题?