D2D1矩阵下鼠标点与归一化绘图表面点的转换问题
问题1:鼠标点击点转表面原始坐标
你的代码问题大概率出在手动实现的矩阵乘法上,D2D已经提供了现成的点变换函数,建议直接用官方接口避免计算错误,同时要注意矩阵可逆性的检查:
- 替换自定义TransformPoint函数
用D2D内置的D2D1::TransformPoint替代自己写的计算逻辑,这个函数会正确处理D2D矩阵的变换规则:
#include <d2d1.h> // 直接用D2D的内置函数完成点变换 D2D1_POINT_2F TransformPoint(const D2D1_MATRIX_3X2_F& matrix, D2D1_POINT_2F point) { return D2D1::TransformPoint(point, matrix); }
- 修正逆矩阵使用流程
确保你获取的变换矩阵是从表面原始坐标到绘制目标坐标的转换矩阵,然后对其求逆,再用逆矩阵变换鼠标点:
// pt 是已归一化到[0,1]的鼠标点击点 D2D1_MATRIX_3X2_F transformMatrix = GetMyTransform(); D2D1_MATRIX_3X2_F inverseMatrix; // 必须检查矩阵是否可逆,不可逆的话逆变换会失败 if (D2D1InvertMatrix(&inverseMatrix, transformMatrix)) { pt = TransformPoint(inverseMatrix, pt); // 此时pt就是表面上的对应原始坐标([0,1]范围) }
问题2:表面原始坐标转绘制目标归一化坐标
这个方向的转换不需要求逆,直接用原始的变换矩阵处理表面点即可:
// surfacePt 是表面上的原始坐标([0,1]范围) D2D1_MATRIX_3X2_F transformMatrix = GetMyTransform(); D2D1_POINT_2F targetPt = D2D1::TransformPoint(surfacePt, transformMatrix); // targetPt 就是转换后绘制范围内的归一化坐标
关键注意事项
- 确认
GetMyTransform()返回的矩阵方向:如果它是将绘制目标坐标转表面坐标的矩阵,那你需要调换逆矩阵和原矩阵的使用顺序。 - 永远检查
D2D1InvertMatrix的返回值,当矩阵缩放为0、或者是奇异矩阵时,逆变换无法完成。
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

