来自微软public目录源码:
BOOL
TouchPanelSetCalibration(
INT32 cCalibrationPoints, //@PARM The number of calibration points
INT32 *pScreenXBuffer, //@PARM List of screen X coords displayed
INT32 *pScreenYBuffer, //@PARM List of screen Y coords displayed
INT32 *pUncalXBuffer, //@PARM List of X coords collected
INT32 *pUncalYBuffer //@PARM List of Y coords collected
);
//此函数主要用于计算触摸屏的校准参数,A1,B1,C1,A2,B2,C2,(delta)。
//cCalibrationPoints为校准的点的个数,这里一般取的是5个。pScreenXBuffer和pScreenYBuffer是校准时的十字叉的显示坐标(这里是显示坐标),pUncalXBuffer和//pUncalYBuffer是触摸屏上十字叉的位置得到的采样点(这里是触摸屏上的采样值)。
至于是怎么计算出这6个参数的呢?看下文就知道了
触摸屏上的点,是怎么和屏幕一个一个对应起来的呢?
首先,我们要建立模型,假设屏幕上的点和触摸屏上的点,可以一个一个对应,通过一个公式,可以算出所有对应的点。这个方法跟数学上的建模类似,通过最后分析,得到一个通用公式:
Xd = A1 *x+ B1*y + C1;
Yd = A2 *x +B2*y + C2;
至于如何建模得到这一个公式,有脑子想想就知道了,平面上的点嘛,一次性方程很容易得到的,关键是精细度有多高。这个公式的建模还是很精细的,可参考以下链接:
http://usbing.com/thread-18681-1-19.html
下面我们来分析这个算法过程,即如何根据5组坐标,得到这6个参数A1,B1,C1,A2,B2,C2,(delta)(或者说7个,以下统称6个):
假设传入的5组参数分别为:
x1,x2,x3,x4,x5
y1,y2,y3,y4,y5 //这几个是触摸屏采样得到的坐标
Xd1,Xd2,Xd3,Xd4,Xd5;
Yd1,Yd2,Yd3,Yd4,Yd5; //这几个是和上边五个点对应的显示坐标
//触摸屏的点,和显示的点,是一一对应的。因为是通过该点的触摸屏坐标,GWES要得到该点的显示坐标。
这样,把参数带入方程 (记住,x,y,Xd,Yd是已知数,要计算的是A1,B1,C1,A2,B2,C2)
A1 *x+ B1*y + C1 = Xd;
A2 *x +B2*y + C2 = Yd;
可得:A1*x1 + B1*y1 + C1 = Xd1;
A1*x2 + B1*y2 + C1 = Xd2;
........
A1*x5 + B1*y5 + C1 = Xd5;
A2*x1 + B2*y1 + C2 = Yd1;
A2*x2 + B2*y2 + C2 = Yd2;
........
A2*x5 + B2*y5 + C2 = Yd5;
上边是得到的两组 三元一次方程组,第一组可计算出A1,B1,C1, 第二组和计算出A2,B2,C2, 下面,我们就第一组方程组的解法来讨论:
要解的方程组为:
A1*x1 + B1*y1 + C1 = Xd1;
A1*x2 + B1*y2 + C1 = Xd2;
........
A1*x5 + B1*y5 + C1 = Xd5;
原方程5个等式直接相加,得:
A1 * ( x1 + x2 +... + x5 ) + B1 * ( y1 + y2 + ... + y5 ) + C1 * 5 = Xd1 + Xd2 + ... + Xd5; //第一个总等式
5个等式分别乘以参数x,得:
A1*x1*x1 + B1*y1*x1 + C1*x1 = Xd1* x1;
A1*x2*x2 + B1*y2*x2 + C1*x2 = Xd2* x2;
........