实现一个正方形的旋转CDlgQ6是开始定义的一个对话框
有输入变量:
m_length 正方形边长
m_angle 旋转角度
m_x 旋转中心X
m_y 旋转中心Y
m_times 旋转次数
点击菜单的时候Edit6,如下代码: 测试数据: 角度45度,边长100,旋转中心(200,200),旋转次数1
void CWorkView::OnEdit6()
{
// TODO: Add your command handler code here
CClientDC dc(this);
m_Qnum=6;
CDlgQ6 Dlg;
if(IDOK==Dlg.DoModal())
{
double rad=0.0174533;
double angle=Dlg.m_angle*rad;
PQ6[0].x=Dlg.m_x-(Dlg.m_length/2);
PQ6[0].y=Dlg.m_y-(Dlg.m_length/2);
PQ6[1].x=Dlg.m_x+(Dlg.m_length/2);
PQ6[1].y=Dlg.m_y-(Dlg.m_length/2);
PQ6[2].x=Dlg.m_x+(Dlg.m_length/2);
PQ6[2].y=Dlg.m_y+(Dlg.m_length/2);
PQ6[3].x=Dlg.m_x-(Dlg.m_length/2);
PQ6[3].y=Dlg.m_y+(Dlg.m_length/2);
PQ6[4]=PQ6[0];
dc.Polyline(PQ6,5); for(int i=0;i<Dlg.m_times;i++)
{
for(int j=0;j<5;j++)
{
PQ6[j].x=PQ6[j].x*cos(angle)-PQ6[j].y*sin(angle)+Dlg.m_x-Dlg.m_x*cos(angle)+Dlg.m_y*sin(angle);
PQ6[j].y=PQ6[j].x*sin(angle)+PQ6[j].y*cos(angle)+Dlg.m_y-Dlg.m_y*cos(angle)-Dlg.m_x*sin(angle);
}
dc.Polyline(PQ6,5);
}
}
}每次出来的结果总是不对,旋转后图形会出现变形,但是怎么找都找不到错误,求指教
有输入变量:
m_length 正方形边长
m_angle 旋转角度
m_x 旋转中心X
m_y 旋转中心Y
m_times 旋转次数
点击菜单的时候Edit6,如下代码: 测试数据: 角度45度,边长100,旋转中心(200,200),旋转次数1
void CWorkView::OnEdit6()
{
// TODO: Add your command handler code here
CClientDC dc(this);
m_Qnum=6;
CDlgQ6 Dlg;
if(IDOK==Dlg.DoModal())
{
double rad=0.0174533;
double angle=Dlg.m_angle*rad;
PQ6[0].x=Dlg.m_x-(Dlg.m_length/2);
PQ6[0].y=Dlg.m_y-(Dlg.m_length/2);
PQ6[1].x=Dlg.m_x+(Dlg.m_length/2);
PQ6[1].y=Dlg.m_y-(Dlg.m_length/2);
PQ6[2].x=Dlg.m_x+(Dlg.m_length/2);
PQ6[2].y=Dlg.m_y+(Dlg.m_length/2);
PQ6[3].x=Dlg.m_x-(Dlg.m_length/2);
PQ6[3].y=Dlg.m_y+(Dlg.m_length/2);
PQ6[4]=PQ6[0];
dc.Polyline(PQ6,5); for(int i=0;i<Dlg.m_times;i++)
{
for(int j=0;j<5;j++)
{
PQ6[j].x=PQ6[j].x*cos(angle)-PQ6[j].y*sin(angle)+Dlg.m_x-Dlg.m_x*cos(angle)+Dlg.m_y*sin(angle);
PQ6[j].y=PQ6[j].x*sin(angle)+PQ6[j].y*cos(angle)+Dlg.m_y-Dlg.m_y*cos(angle)-Dlg.m_x*sin(angle);
}
dc.Polyline(PQ6,5);
}
}
}每次出来的结果总是不对,旋转后图形会出现变形,但是怎么找都找不到错误,求指教
{
// TODO: Add your command handler code here
CClientDC dc(this);
m_Qnum=6; //工程项目代码,此例中无意义
CDlgQ6 Dlg; //对话框对象
if(IDOK==Dlg.DoModal())
{
double rad=0.0174533; //角度转弧度的单位量
double angle=Dlg.m_angle*rad; //角度转弧度
PQ6[0].x=Dlg.m_x-(Dlg.m_length/2); //定义初始正方形
PQ6[0].y=Dlg.m_y-(Dlg.m_length/2);
PQ6[1].x=Dlg.m_x+(Dlg.m_length/2);
PQ6[1].y=Dlg.m_y-(Dlg.m_length/2);
PQ6[2].x=Dlg.m_x+(Dlg.m_length/2);
PQ6[2].y=Dlg.m_y+(Dlg.m_length/2);
PQ6[3].x=Dlg.m_x-(Dlg.m_length/2);
PQ6[3].y=Dlg.m_y+(Dlg.m_length/2);
PQ6[4]=PQ6[0];
dc.Polyline(PQ6,5); //画图for(int i=0;i <Dlg.m_times;i++) //进行一次变换
{
for(int j=0;j <5;j++) //每次变换中对单个点的操作
{
PQ6[j].x=PQ6[j].x*cos(angle)-PQ6[j].y*sin(angle)+Dlg.m_x-Dlg.m_x*cos(angle)+Dlg.m_y*sin(angle); //X值的变换
PQ6[j].y=PQ6[j].x*sin(angle)+PQ6[j].y*cos(angle)+Dlg.m_y-Dlg.m_y*cos(angle)-Dlg.m_x*sin(angle); //Y值的变换
}
dc.Polyline(PQ6,5); //画变换后的图形
}
}
}
1. 利用顶点和旋转中心对应坐标之差构成的向量作旋转:
原顶点P(x, y) 中心O(x0, y0) 构成的向量a=(x-x0, y-y0)=r(cosA, sinA)
旋转后长度r不变, 向量整体变成a'=(x'-x0, y'-y0)=r(cos(A+B), sin(A+B))
所以x'-x0=rcos(A+B)=rcosAcosB-rsinAsinB=(x-x0)cosB-(y-y0)sinB
所以x'=x0+(x-x0)cosB-(y-y0)sinB;
同理y'=y0+(y-y0)cosB+(x-x0)sinB;
所以算法应该没有问题的, 我也仔细看过你的代码了, 算法部分没有问题
2. 可能的问题在于:
旋转后的顶点坐标由于需要取整可能会导致与理论值存在一定的误差, 所以可能会导致变换后的图形存在变形的情况
但是逆向映射法同样会出现映射到源图像坐标时不是整数的问题。这里就需要“重采样滤波器”。
这步你做了么?
double rad=0.0174533;
double angle=Dlg.m_angle*rad;
做的就是这个工作
经过一步一步的排查,问题出再哪我知道了,但是不知道为什么会出这个错误
出错的地方就是从
for(int i=0;i <Dlg.m_times;i++) //进行一次变换
这个地方开始,貌似angle的值传不进去,导致cos(angle)算错
{
for(int j=0;j <5;j++)
{
PQ6[j].x=PQ6[j].x*cos(angle)-PQ6[j].y*sin(angle)+Dlg.m_x-Dlg.m_x*cos(angle)+Dlg.m_y*sin(angle); //X值的变换
PQ6[j].y=PQ6[j].x*sin(angle)+PQ6[j].y*cos(angle)+Dlg.m_y-Dlg.m_y*cos(angle)-Dlg.m_x*sin(angle); 里面的循环变量i好像没有用到!另外,楼主有没有调试一下,angle的值是多少?
j是控制每个数组的
angle的值我断点过,正常的
但是貌似cos(angle)和sin(angle)的值不正常
你得到的angle与cos(angle)和sin(angle)的值都是多少?
angle值是正常的,我断点N次了
输入45度的话,angle就是0.78左右
但是每次一用cos(angle)和sin(angle)的时候,值就不对了,就卡在这
建议lz在循环中加上打印语句,打印angle值及m_angle值如果dlg.m_angle值在改变输入时始终没变,就是值更新的问题