已知仿射变换的系数,求仿射变换的反向系数

对于如下从(xx,yy)到(X,Y)的仿射变换:

X = xx + ax * xx + bx * yy + cx
Y = yy + ay * xx + by * yy + cy

已知(ax,bx,cx),(ay,by,cy)为其仿射变换系数,则(X,Y)到(xx,yy)必然也存在仿射变换关系:

xx = X + axp* X + bxp * Y + cxp
yy = Y + ayp * X + byp * Y + cyp

求其对应的反向系数(axp,bxp,cxp),(ayp,byp,cyp)。

int main()
{	
	double ax = -0.00012457722524773310000000000;
	double bx = -0.00026952578840466643000000000;
	double cx = -40.53236981248609500000000000000;

	double ay = 0.00088450690917435935000000000;
	double by = -0.00006127575130507561900000000;
	double cy = -210.50907546352857000000000000000;

	double tt = ax * by + ax + by + 1 - bx * ay;

	double axp = (by+1) / tt - 1;
	double bxp = -bx / tt;
	double cxp = (bx * cy - cx - by * cx) / tt;
	double ayp = -ay / tt;
	double byp = (ax + 1) / tt - 1;
	double cyp = (ay * cx - cy - ax * cy) / tt;

	printf("%.10lf\t%.10lf\t%.10lf\n", axp, bxp, cxp);
	printf("%.10lf\t%.10lf\t%.10lf\n", ayp, byp, cyp);

	double xx = 500;
	double yy = 600;

	double X = xx + ax* xx + bx* yy + cx;
	double Y = yy + ay * xx + by * yy + cy;

	printf("原始:%.10lf\t%.10lf\n", xx, yy);
	printf("正运算:%.10lf\t%.10lf\n", X, Y);
	
	//axp = 0.00012480028850991864000000000;
	//bxp = 0.00026947569230899039000000000;
	//cxp = 40.47053059568900600000000000000;

	//ayp = -0.00088529760825697967000000000;
	//byp = 0.00006131347116844487700000000;
	//cyp = 210.73126518749581000000000000000;

	xx = X + axp* X + bxp * Y + cxp;
	yy = Y + ayp * X + byp * Y + cyp;
	printf("逆运算:%.10lf\t%.10lf\n", xx, yy);	

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charlee44

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值