摄影测量转角系统转换——OPK转换至POK下

摄影测量转角系统OPK转换至POK下

最近学习了一种新的角度单位,gon
gon 定义. Gon,百分度制 (GRAD)角度单位,用G表示。. 1G = 直角的1%。.
因为做实验用的数据是这个角度单位,但是咱们一般都是用弧度制rad,所以要先进行角度单位的转换。

转角系统

在这里插入图片描述

代码

输入的pos文件如下
第一行是数据量
第二行分别是:
序号 w(gon) p(gon) k(gon) X Y Z (120忘了是啥了,不重要)
在这里插入图片描述

#include<stdio.h>
#include<iostream>
#include<fstream>

using namespace std;

#define SPGT_PI           3.1415926535897932384626433832795       /* PAI */
#define PI_3              1.0471975511965977461542144610932

#define SPGT_R2D          (180.0/SPGT_PI)  // 57.295779513082320876798154814105
#define SPGT_D2R          (SPGT_PI/180.0)  // 0.01745329251994329576923690768489

typedef struct imgInfo {
	long index;
	double w;
	double p;
	double k;
	double X;
    double Y;
	double Z;
}imgIn;

static inline double* OnPK2M(double o, double p, double k, double* r)
{
	double cosp = cos(p); double cosw = cos(o); double cosk = cos(k);
	double sinp = sin(p); double sinw = sin(o); double sink = sin(k);
	r[0] = cosp * cosk;
	r[1] = -sink * cosp;
	r[2] = -sinp;
	r[3] = -sinw * sinp * cosk + cosw * sink;
	r[4] = sinw * sinp * sink + cosw * cosk;
	r[5] = -sinw * cosp;
	r[6] = cosw * sinp * cosk + sinw * sink;
	r[7] = -sink * cosw * sinp + sinw * cosk;
	r[8] = cosw * cosp;
	return r;
}

inline double* OPK2M(double o, double p, double k, double* r)
{ return OnPK2M(o, -p, k, r); }

inline void M2nPOK(double* r, double* p, double* o, double* k) {
	*o = asin(-r[5]);         // r[5] = -sinw;
	*p = atan2(-r[2], r[8]);  // r[2] = -sinp*cosw; r[8] = cosp*cosw;
	*k = atan2(r[3], r[4]);  // r[3] =  cosw*sink; r[4] = cosw*cosk;
}

int main() {
	ifstream fp("F:\\experiment\\Images\\pos.txt");
	int imgNum;
	float f;
	
	fp >> imgNum;
	imgIn* pos = new imgIn[imgNum];
	for (int i = 0; i < imgNum; i++) {
		fp >> pos[i].index >> pos[i].w >> pos[i].p >> pos[i].k >> pos[i].X >> pos[i].Y >> pos[i].Z >> f;
		//单位转变(gon->rad)
		pos[i].p = pos[i].p * 0.9 * SPGT_D2R;
		pos[i].w = pos[i].w * 0.9 * SPGT_D2R;
		pos[i].k = pos[i].k * 0.9 * SPGT_D2R;
	}
	fp.close();

	//转角系统opk->pok
	double M_1[9];
	for (int i = 0; i < imgNum; i++) {
		OPK2M(pos[i].w, pos[i].p, pos[i].k, M_1);
		M2nPOK(M_1, &pos[i].p, &pos[i].w, &pos[i].k);
	}
	ofstream outf("pos.txt");
	outf.setf(ios::fixed);
	outf.precision(5);
	for (int i = 0; i < imgNum; i++) {
		outf << pos[i].index << " " << pos[i].p << " " << pos[i].w << " " << pos[i].k << " " << pos[i].X << " " << pos[i].Y << " " << pos[i].Z<<endl;
	}
	outf.close();
	delete[] pos;
	return 0;
}

最后输出
在这里插入图片描述
最后输出即为pok坐标系下的坐标。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值