坐标转换程序(地图坐标到图像坐标)

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值