在VC中,如何在MM_TEXT坐标下,进行一个点相对于另一个点(基点)的旋转,如果能给出代码,将万分感谢!!

解决方案 »

  1.   

    void CT1View::DrawPoint(CDC * pDC, CPoint p, CPoint basePoint)
    {
    CPoint p1;
    p1.x = 2* basePoint.x - p.x;
    p1.y = 2* basePoint.y - p.y;
    pDC->SetPixel(p1,RGB(0,0,0));
    }
    //p为原始点,p1为旋转点,basePoint为基点
      

  2.   

    以这个点为中心,另外一个点画圆,旋转用timer 实现,算法比较简单
      

  3.   

    Point p;
    饶原点旋转的公式:[p.x]   [cos(a)  sin(a)]
                      |   | * |              |
                      [p.y]   [sin(-a) cos(a)],
    p饶p1旋转类推。Easy!!!
      

  4.   

    CPoint CBase::Circu(CPoint bp, CPoint mp, double alpha)
    {float k;
    double q, r;
    CPoint rp;
    int x,y;
    CString str;
        alpha=(alpha/180)*3.141592654; if(bp.x==mp.x){if(bp.y>mp.y)q=-1.57;else q=1.57;}
    else
    {
    int delty=mp.y-bp.y;
    int deltx=mp.x-bp.x;
    k=((float)delty)/deltx;
            q=atan(k);
    if(q<0)
    {
      q+=3.141592654;
      if(deltx>0)
      q+=3.141592654;
    }
    else
        if(deltx<0)
    {
       q+=3.141592654;
    } }
    r=sqrt((mp.x-bp.x)*(mp.x-bp.x)+(mp.y-bp.y)*(mp.y-bp.y));
    x=long(r*cos(alpha+q)+bp.x);
    y=long(r*sin(alpha+q)+bp.y);
    rp.x=x;
    rp.y=y;
        return rp;}//mp绕bp转动alpha角的位置
      

  5.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=202254
      

  6.   

    嗯,谢谢各位。
    其实我的问题就是想旋转一个矩形,我想,旋转矩形的四个角的点坐标后,在用LineTo把它们连起来,就可以成为一个旋转后的矩形了。我用zhaogaojian(米柑年成)提供的算法,但是,旋转后的矩形失真很大啊,有没有更精确的算法啊
      

  7.   

    [x][cos(a)  sin(a)]   [x1]
    [y][-sin(a) cos(a)] = [y1]  
    [1][0            1]   [ 1] 
    a旋转的角度
      

  8.   

    呀!失真很大,现在一直用的这个,因为以前用的逻辑坐标比较大,没注意这个情况,
    void rotate_point(theta,x,y,x_org,y_org)
    double theta,*x,*y;
    int x_org,y_org;
    {
      double tx,ty;
      tx=*x-x_org;
      ty=*y-y_org;
      *x=tx*cos(theta)-ty*sin(theta);
      *y=tx*sin(theta)+ty*cos(theta);
      *x+=x_org;
      *y+=y_org;
    }
      

  9.   

    void CPpppDlg::rotate_point(double theta, double *x, double *y, double x_org, double y_org)
    {
    double tx,ty;
    tx=*x-x_org;
    ty=*y-y_org;
    *x=tx*cos(theta)-ty*sin(theta);
    *y=tx*sin(theta)+ty*cos(theta);
    *x+=x_org;
    *y+=y_org;
    }
    void CPpppDlg::OnButton1() 
    {
    double x=10.0,y=10.0;
    rotate_point(3.1415926,&x,&y,0.0,0.0);
    CString str;
    str.Format("%f,%f",x,y);
    AfxMessageBox(str) ;

    }
    这样比较清晰一点
      

  10.   

    感谢各位,尤其感谢zhaogaojian(米柑年成)