实现一个正方形的旋转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);
}
}
}每次出来的结果总是不对,旋转后图形会出现变形,但是怎么找都找不到错误,求指教

解决方案 »

  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);  //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);                                     //画变换后的图形



      

  2.   

    个人看法:
    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. 可能的问题在于:
    旋转后的顶点坐标由于需要取整可能会导致与理论值存在一定的误差, 所以可能会导致变换后的图形存在变形的情况 
      

  3.   

    旋转,建议使用逆向映射!http://blog.csdn.net/suiyunonghen/archive/2009/05/29/4224838.aspx
    但是逆向映射法同样会出现映射到源图像坐标时不是整数的问题。这里就需要“重采样滤波器”。
      

  4.   

    你的45度,对应的sin值什么的,要改成弧度!45/180*3.1415926
    这步你做了么?
      

  5.   


    double rad=0.0174533; 
    double angle=Dlg.m_angle*rad; 
    做的就是这个工作
    经过一步一步的排查,问题出再哪我知道了,但是不知道为什么会出这个错误
    出错的地方就是从
    for(int i=0;i <Dlg.m_times;i++)                                //进行一次变换 
    这个地方开始,貌似angle的值传不进去,导致cos(angle)算错
      

  6.   

    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);  里面的循环变量i好像没有用到!另外,楼主有没有调试一下,angle的值是多少?
      

  7.   

    i主要是控制循环次数,所以里面没用到
    j是控制每个数组的
    angle的值我断点过,正常的
    但是貌似cos(angle)和sin(angle)的值不正常
      

  8.   

    呵呵,如果是cos(angle)和sin(angle)的值不正常,那就说明你的angle值不正常!
    你得到的angle与cos(angle)和sin(angle)的值都是多少?
      

  9.   


    angle值是正常的,我断点N次了
    输入45度的话,angle就是0.78左右
    但是每次一用cos(angle)和sin(angle)的时候,值就不对了,就卡在这
      

  10.   

    你这样,先求出cos(angle)和sin(angle)值,然后,直接用这些值替换,还有,自己将cos(angle)和sin(angle)打印出来看看!
      

  11.   

    还是不对,反正就是,在FOR之前都没错,一进FOR就找不到哪里错了
      

  12.   


    建议lz在循环中加上打印语句,打印angle值及m_angle值如果dlg.m_angle值在改变输入时始终没变,就是值更新的问题