C++ 移动、缩放和旋转坐标系
我有一个图像坐标系和一个瓷砖坐标系 我想知道瓷砖坐标系中的点(u_img/v_img) 坐标系用sigma进行缩放。u_img=西格玛*u_瓦; 偏移在平铺坐标系中给出。 两个坐标系之间的旋转角度为航向 我想要的是(u_tile v_tile)=f(u_img,v_img,sigma,heading,u_trans,v_trans) 我从以下几点开始:C++ 移动、缩放和旋转坐标系,c++,rotation,system,translation,coordinate,C++,Rotation,System,Translation,Coordinate,我有一个图像坐标系和一个瓷砖坐标系 我想知道瓷砖坐标系中的点(u_img/v_img) 坐标系用sigma进行缩放。u_img=西格玛*u_瓦; 偏移在平铺坐标系中给出。 两个坐标系之间的旋转角度为航向 我想要的是(u_tile v_tile)=f(u_img,v_img,sigma,heading,u_trans,v_trans) 我从以下几点开始: void image2tile( uint u_img, uint v_img, int u_tran
void image2tile( uint u_img, uint v_img,
int u_trans_tile, int v_trans_tile,
float imgPixelSize, float tilePixelSize,
float heading,
int& u_tile, int& v_tile )
{
float ratio = imgPixelSize / tilePixelSize;
int u_trans = u_img * ratio + u_trans_tile;
int v_trans = v_img * ratio + v_trans_tile;
v_tile = floor( v_trans * cos( heading ) + u_trans * sin ( heading ) );
u_tile = floor( -v_trans * sin( heading ) + u_trans * cos ( heading ) );
}
有一些结果似乎是合理的,但如果我把u_img=0和v_img=0放进去,我会得到u_trans_tile和v_trans_tile,而事实并非如此
我认为解决方案可能是这样的:
1.)将平铺坐标中的平移转换为图像坐标
2.)之后,它只是一个法线变换,使用比例因子乘以旋转矩阵乘以点向量,再加上新的平移向量
u\u trans\u tile->u\u trans\u img
v_trans_tile->u_trans_img
v_tile = floor( ratio*( v_img * cos( heading ) + u_img * sin ( heading ) + u_trans_img);
u_tile = floor( ratio*(-v_img * sin( heading ) + u_img * cos ( heading ) + v_trans_img);
但事实上我没能让它工作。。有什么解决方案吗?可能是由于将中间结果强制转换为
int
所导致的舍入错误
这是准确的
float u_trans = u_img * ratio + u_trans_tile;
float v_trans = v_img * ratio + v_trans_tile;
结果是否不是预期的,或者是否存在其他错误?什么类型是
imgPixelSize
和tilePixelSize
?如果它们是整数,那么您的问题是整数除法,它不会产生预期的结果。结果不是预期的结果,我认为我的转换不正确。我更改了添加的函数头,以便您可以看到imgPix和tilePix都是浮点数。您是否检查了cos(m_currGpsPos_s.heading)
返回您期望的值?否则,您的转换看起来是正确的,尽管当您切换v_tile
和u_tile
的顺序时,代码有些混乱。我编辑了我的问题,也许这会对您有所帮助。我真的认为我没有正确的转换。对u_trans
和v_trans
使用int
可能会导致舍入,但最大值为1像素。实际上转换是错误的,但这个答案也有助于改进算法。@Andrey我很抱歉我的评论听起来是否定的。我想你指出了一个重要的错误。我只是想补充一点,这会导致一个小错误。@yokolini:旋转角度是如何定义的?确保它在弧度方向上,并且是相对于x轴的逆时针方向。它在弧度方向上,并且是逆时针方向。u_img和v_img=0和heading=0的简单结果是错误的!