#include "stdafx.h"
#include "coordinate.h"
/*************************************************
Function: MapAndPicPointTran(Point MapPoint[4],Point PicPoint[4],double EqtCoefft[8],char channel)
Description: 利用地图坐标(x,y)和图像坐标(u,v)满足方程组关系,
求出a~h的系数值并保存在EquationCoefficient.ini文档中;
Input: MapPoint[4]、PicPoint[4]表示从地图坐标和图像坐标取得的4组对应点,channel表示通道号;
Output: 将得到a~h系数存放于数组EqtCoefft[8]中;
EquationCoefficient.ini:存储系数
Return: 如果函数返回1则表示函数可逆,求出系数,如果函数返回0说明矩阵不可逆,无法得到系数;
*************************************************/
bool _stdcall MapAndPicPointTran(Point MapPoint[4],Point PicPoint[4],double EqtCoefft[8],char channel)
{
double c[P][P]={PicPoint[0].x,PicPoint[0].y,1,0,0,0, -MapPoint[0].x*PicPoint[0].x,-MapPoint[0].x*PicPoint[0].y,
PicPoint[1].x,PicPoint[1].y,1,0,0,0, -MapPoint[1].x*PicPoint[1].x,-MapPoint[1].x*PicPoint[1].y,
PicPoint[2].x,PicPoint[2].y,1,0,0,0, -MapPoint[2].x*PicPoint[2].x,-MapPoint[2].x*PicPoint[2].y,
PicPoint[3].x,PicPoint[3].y,1,0,0,0, -MapPoint[3].x*PicPoint[3].x,-MapPoint[3].x*PicPoint[3].y,
0,0,0,PicPoint[0].x,PicPoint[0].y,1,-MapPoint[0].y*PicPoint[0].x,-MapPoint[0].y*PicPoint[0].y,
0,0,0,PicPoint[1].x,PicPoint[1].y,1,-MapPoint[1].y*PicPoint[1].x,-MapPoint[1].y*PicPoint[1].y,
0,0,0,PicPoint[2].x,PicPoint[2].y,1,-MapPoint[2].y*PicPoint[2].x,-MapPoint[2].y*PicPoint[2].y,
0,0,0,PicPoint[3].x,PicPoint[3].y,1,-MapPoint[3].y*PicPoint[3].x,-MapPoint[3].y*PicPoint[3].y};
double result1[P]={MapPoint[0].x,MapPoint[1].x,MapPoint[2].x,MapPoint[3].x,MapPoint[0].y,MapPoint[1].y,MapPoint[2].y,MapPoint[3].y};
int i,j,k;
double result[P][P];
double b[P][Q];
double x[P]={0};
/*****************输入矩阵元素***********************/
for(i=0;i<P;i++)
{
for(j=0;j<P;j++)
{
b[i][j]=c[i][j];
}
}
/*****************扩展矩阵***********************/
for(i=0;i<P;i++)
{
for(j=P;j<Q;j++)
{
if(i==(j-P))
{
b[i][j]=1;
}
else
{
b[i][j]=0;
}
}
}
/*****************求逆模块***********************/
for(i=0;i<P;i++)
{
if(b[i][i]==0)
{
for(k=i;k<P;k++)
{
if((b[k][k]<-ZEROFLOAT)||(b[k][k]>ZEROFLOAT))
{
for(int j=0;j<Q;j++)
{
double temp;
temp=b[i][j];
b[i][j]=b[k][j];
b[k][j]=temp;
}
break;
}
}
if(k==P)
{
return 0;
}
}
for(j=Q-1;j>=i;j--)
{
b[i][j]/=b[i][i];
}
for(k=0;k<P;k++)
{
if(k!=i)
{
double temp=b[k][i];
for(j=0;j<Q;j++)
{
b[k][j]-=temp*b[i][j];
}
}
}
}
/*****************导出结果***********************/
for(i=0;i<P;i++)
{
for(j=P;j<Q;j++)
{
result[i][j-P]=b[i][j];
}
}
for(i=0;i<P;i++)
{
for(j=0;j<P;j++)
{
x[i]+=result[i][j]*result1[j];
}
}
/***************获取通道对应系数**************/
for(j=0;j<P;j++)
{
EqtCoefft[j]=x[j];
}
// double n[8]={x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]};
/*****************系数写入文档********************/
FILE *pEquationCoefficientFile;
char appPath[256];
GetCurrentDirectory(256,appPath); //取得应用程序当前路径
CString FilePath;
FilePath.Format("%s",appPath);
FilePath+="//EquationCoefficient.ini";
CString strSection;
char tempEqtCof;
CString strSectionKey;
CString strValue = _T("0");
while((pEquationCoefficientFile=fopen("EquationCoefficient.ini","r+"))==NULL)//初始化ini文档
{
for(unsigned short int tempChannel=0;tempChannel<256;tempChannel++)
{
strSection.Format("通道%d",tempChannel);
for(tempEqtCof=1;tempEqtCof<9; tempEqtCof++)
{
strSectionKey.Format("EquationCoefficient%d",tempEqtCof);
WritePrivateProfileString (strSection,strSectionKey,strValue, FilePath);
}
}
}
strSection.Format("通道%d",channel);
CString strEquationCoefficient;
strEquationCoefficient.Format("EquationCoefficient%d=%f",tempEqtCof,n[tempEqtCof-1]);//获取通道对应的节名
CString strtmp;
char*tmp;
char buf[1024];
tmp=new char[MAX_PATH];
memset(buf,0,1024);
int pos;
for(tempEqtCof=1;tempEqtCof<9;tempEqtCof++)//通道对应的键名、数据写入
{
strtmp.Format("EquationCoefficient%d=%f",tempEqtCof,n[tempEqtCof-1]);
WritePrivateProfileString (strSection,strSectionKey,strValue, FilePath);
tmp=strtmp.GetBuffer(0);
if(strlen(buf)==0)
{
memcpy(buf,tmp,strtmp.GetLength());
pos=strtmp.GetLength()+1;
}
else
{
memcpy(buf+pos,tmp,strtmp.GetLength());
pos+=strtmp.GetLength()+1;
}
}
WritePrivateProfileSection(strSection,buf,FilePath);
return 1;
}
/*************************************************
Function: GetMapPoint(Point *MapPoint,Point PicPoint,double EqtCoefft[8],double EqtCoefft[8])
Description: 利用地图坐标(x,y)和图像坐标(u,v)满足方程组关系,
求出图像坐标对应的地图坐标;
Input: PicPoint表示从地图坐标上取得的某一已知点,EqtCoefft[8]为输入系数;
Output: MapPoint表示对应的地图坐标指针;
Return: 如果函数返回1则表示坐标转换成功,否则,转换失败;
*************************************************/
bool _stdcall GetMapPoint(Point *MapPoint,Point PicPoint,double EqtCoefft[8])
{
if((EqtCoefft[6]*PicPoint.x+EqtCoefft[7]*PicPoint.y+I)==0)
return 0;
MapPoint->x=(EqtCoefft[0]*PicPoint.x+EqtCoefft[1]*PicPoint.y+EqtCoefft[2])/(EqtCoefft[6]*PicPoint.x+EqtCoefft[7]*PicPoint.y+I);
MapPoint->y=(EqtCoefft[3]*PicPoint.x+EqtCoefft[4]*PicPoint.y+EqtCoefft[5])/(EqtCoefft[6]*PicPoint.x+EqtCoefft[7]*PicPoint.y+I);
return 1;
}
/*************************************************
Function: GetPicPoint(Point MapPoint,Point *PicPoint,double EqtCoefft[8],double EqtCoefft[8])
Description: 利用地图坐标(x,y)和图像坐标(u,v)满足方程组关系,
求出地图坐标对应的图像坐标;
Input: MapPoint表示从地图坐标上取得的某一已知点,EqtCoefft[8]为输入系数;
Output: PicPoint表示对应的地图坐标指针;
Return: 如果函数返回1则表示坐标转换成功,否则,转换失败;
*************************************************/
bool _stdcall GetPicPoint(Point MapPoint,Point *PicPoint,double EqtCoefft[8])
{
if(((EqtCoefft[6]*MapPoint.x-EqtCoefft[0])*(EqtCoefft[7]*MapPoint.y-EqtCoefft[4])
-(EqtCoefft[6]*MapPoint.y-EqtCoefft[3])*(EqtCoefft[7]*MapPoint.x-EqtCoefft[1]))==0)
return 0;
if(((EqtCoefft[7]*MapPoint.x-EqtCoefft[1])*(EqtCoefft[6]*MapPoint.y-EqtCoefft[3])
-(EqtCoefft[7]*MapPoint.y-EqtCoefft[4])*(EqtCoefft[6]*MapPoint.x-EqtCoefft[0]))==0)
return 0;
PicPoint->x=((EqtCoefft[2]-I*MapPoint.x)*(EqtCoefft[7]*MapPoint.y-EqtCoefft[4])-(EqtCoefft[5]-I*MapPoint.y)*(EqtCoefft[7]*MapPoint.x-EqtCoefft[1]))
/((EqtCoefft[6]*MapPoint.x-EqtCoefft[0])*(EqtCoefft[7]*MapPoint.y-EqtCoefft[4])-(EqtCoefft[6]*MapPoint.y-EqtCoefft[3])*(EqtCoefft[7]*MapPoint.x-EqtCoefft[1]));
PicPoint->y=((EqtCoefft[2]-I*MapPoint.x)*(EqtCoefft[6]*MapPoint.y-EqtCoefft[3])-(EqtCoefft[5]-I*MapPoint.y)*(EqtCoefft[6]*MapPoint.x-EqtCoefft[0]))
/((EqtCoefft[7]*MapPoint.x-EqtCoefft[1])*(EqtCoefft[6]*MapPoint.y-EqtCoefft[3])-(EqtCoefft[7]*MapPoint.y-EqtCoefft[4])*(EqtCoefft[6]*MapPoint.x-EqtCoefft[0]));
return 1;
}