fuliangliang的Blog

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

用户操作
[即时聊天] [发私信] [加为好友]
fuliangID:fuliangliang
65384次访问,排名1601好友1人,关注者3
fuliangliang的文章
原创 100 篇
翻译 0 篇
转载 25 篇
评论 29 篇
fuliang的公告

我的联系方式:20542606

Email:fuliangliang@gmail.com


最近评论
topgunqq:条理清楚,简单易学.比网上其他例子要好一些.至少按照楼主写的过程,我这个初学者实验成功了!
marshluca:恭喜~~
请问有没rails 做的项目,比方blog?
marshluca@gmail.com
marshluca:恭喜~~
请问有没rails 做的项目,比方blog?
marshluca@gmail.com
chucai:写的非常的好,仔细的拜读了。思路很清晰。考虑的问题也比较全面。
tbsc3:我也遇到了这个问题,如果配1 M就有用,大于2M就还是默认的 不知道你有没有解决呀,教教我
文章分类
收藏
    相册
    净月潭一日游
    页面图片
    日历
    文章收藏
    我的JavaEye博客
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 MFC下实现图形学之立方体平移、比例、旋转、投影变换算法收藏

    新一篇: MFC下实现图形学之Hermite、Bezier曲线的绘制 | 旧一篇: MFC下实现图形学之多边形扫描转化填充算法

    //*********************************
    //绘制坐标系以及初始立方体
    //*********************************
    void CTransGraphicsView::OnDraw(CDC* pDC)
    {
     CTransGraphicsDoc* pDoc = GetDocument();
     ASSERT_VALID(pDoc);
     HBRUSH hbrush;
     CPen pen;
     HPEN hPen;
     // TODO: add draw code for native data here
     pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
     hPen=(HPEN)pDC->SelectObject(pen);
     pDC->SetViewportOrg(cxClient/2,cyClient/2);
     pDC->MoveTo(-cxClient/2,0);
     pDC->LineTo(cxClient/2,0);
     pDC->MoveTo(0,-cyClient/2);
     pDC->LineTo(0,cyClient/2);
     pen.DeleteObject();
        pDC->SelectObject(hPen);
     this->ShadowTrans(-45);
     for(int i=0;i<4;i++)
     {
       pDC->MoveTo(cpoints[i]);
       pDC->LineTo(cpoints[i+4]);
     }
     hbrush = (HBRUSH)pDC->SelectObject(GetStockObject(NULL_BRUSH)) ;
     pDC->Polygon(cpoints,4);
     pDC->Polygon(cpoints+4,4);
     
    }
    //********************
    //矩阵的乘法
    //*********************
    void CTransGraphicsView::MutiTransMarix(double a[1][4],double b[4][4],double MutiResult[1][4])
    {
     for(int i=0;i<4;i++) MutiResult[0][i] = 0;
     for(i=0; i<1;i++)
      for(int j=0;j<4;j++)
       for(int k=0;k<4;k++)
        MutiResult[i][j] += a[i][k]*b[k][j];
    }
    //******************************
    //将坐标转化为矩阵形式(向量)
    //******************************
    void CTransGraphicsView::TransPointToMarix(ThPoint &tp,double a[1][4])
    {
     a[0][0] = tp.x;
     a[0][1] = tp.y;
     a[0][2] = tp.z;
     a[0][3] = 1;
    }
    //******************************
    //将矩阵(向量)转化为三维坐标形式
    //******************************
    void CTransGraphicsView::TransMarixToPoint(double a[1][4],ThPoint &tp)
    {
     tp.x = a[0][0];
     tp.y = a[0][1];
     tp.z = a[0][2];
    }
    //******************************
    //立方体的平移算法
    //******************************
    void CTransGraphicsView::MoveTrans(double x,double y,double z)
    {
        double a[8][4],result[1][4];
     double moveMarix[4][4] =
     {
      {1,0,0,0},{0,1,0,0},
      {0,0,1,0},{x,y,z,1}
     };
     
         for(int i=0;i<8;i++)
     {
              TransPointToMarix(points[i],a+i);
       MutiTransMarix(a+i,moveMarix,result);
       TransMarixToPoint(result,points[i]);
     }
     ShadowTrans(-45);
    }
    //****************************************************
    //立方体的斜交投影算法(将三维坐标转化为二维在屏幕显示)
    //****************************************************
    void CTransGraphicsView::ShadowTrans(int degree)
    {
     double a[8][4],result[1][4];
     ThPoint pts[8];
     for(int i=0;i<8;i++)
     {
      pts[i].x = points[i].x;
      pts[i].y = points[i].y;
      pts[i].z = points[i].z;
     }
     double shadowMarix[4][4] =
     {
      {1,0,0,0},{0,1,0,0},
      {cos(degree),sin(degree),0,0},{0,0,0,1}
     };
     
        for(i=0;i<8;i++)
     {
              TransPointToMarix(pts[i],a+i);
       MutiTransMarix(a+i,shadowMarix,result);
       TransMarixToPoint(result,pts[i]);
     }
     for(i=0;i<8;i++)
     {
      cpoints[i].x = (int)pts[i].x;
      cpoints[i].y = (int)pts[i].y;
     }
    }
    //***************************************
    //立方体旋转算法,旋转中心可以是x,y或z轴
    //degree旋转的度数, rc旋转中心
    //****************************************
    void CTransGraphicsView::RotateTrans(double degree,CString rc)

        double a[8][4],result[1][4];
        int i = 0;
       
     if(rc == "z")
     {
      double xRotateMarix[4][4] =
       {
        {cos(degree*3.14/180),sin(degree*3.14/180),0,0},
        {-sin(degree*3.14/180),cos(degree*3.14/180),0,0},
        {0,0,1,0},{0,0,0,1},
       };
             for(i=0;i<8;i++)
       {
               TransPointToMarix(points[i],a+i);
            MutiTransMarix(a+i,xRotateMarix,result);
         TransMarixToPoint(result,points[i]);
       }
     }
     else if(rc == "x")
      {
      double yRotateMarix[4][4]=
       {
        {1,0,0,0},
        {0,cos(degree*3.14/180),sin(degree*3.14/180),0},
        {0,-sin(degree*3.14/180),cos(degree*3.14/180),0},
        {0,0,0,1}
       };
                   for(i=0;i<8;i++)
       {
                       TransPointToMarix(points[i],a+i);
                MutiTransMarix(a+i,yRotateMarix,result);
         TransMarixToPoint(result,points[i]);
       }
         
      }
      else if(rc == "y")
      {
      double zRotateMarix[4][4]=
       {
        {cos(degree*3.14/180),0,-sin(degree*3.14/180),0},
        {0,1,0,0},
        {sin(degree*3.14/180),0,cos(degree*3.14/180),0},
        {0,0,0,1}
      };
             for(i=0;i<8;i++)
       {
               TransPointToMarix(points[i],a+i);
            MutiTransMarix(a+i,zRotateMarix,result);
         TransMarixToPoint(result,points[i]);
       }
         
      }
        ShadowTrans(-45);
    }
    //*********************************
    //立方体的比例变换算法
    //*********************************
    void CTransGraphicsView::BigerOrSmallerTrans(double timeX,double timeY,double timeZ)
    {
        double a[8][4],result[1][4];
     double bsMarix[4][4] =
     {
      {timeX,0,0,0},{0,timeY,0,0},
      {0,0,timeZ,0},{0,0,0,1}
     };
           for(int i=0;i<8;i++)
     {
              TransPointToMarix(points[i],a+i);
       MutiTransMarix(a+i,bsMarix,result);
       TransMarixToPoint(result,points[i]);
     }
     ShadowTrans(-45);
    }
    #endif //_DEBUG

    /////////////////////////////////////////////////////////////////////////////
    // CTransGraphicsView message handlers
    //********************************
    //获取屏幕的大小
    //********************************
    void CTransGraphicsView::OnSize(UINT nType, int cx, int cy)
    {
     CView::OnSize(nType, cx, cy);
     
     // TODO: Add your message handler code here
     cxClient = cx;
     cyClient = cy;
    }
    //*****************************************
    //根据对话框输入的参数进行比例变换
    //*****************************************
    void CTransGraphicsView::OnBgsm()
    {
     // TODO: Add your command handler code here
     BGSMDialog B_dlg;
     if(IDOK == B_dlg.DoModal())
     {
             BiggerOrSmallerTrans(B_dlg.m_sx,B_dlg.m_sy,B_dlg.m_sz);
     }
     Invalidate();
     UpdateWindow();
    }
    //********************************
    //根据对话框输入的参数进行平移变换
    //********************************
    void CTransGraphicsView::OnMove()
    {
     // TODO: Add your command handler code here
     CMoveDialog M_dlg;
     if(IDOK == M_dlg.DoModal())
     {
            MoveTrans(M_dlg.m_dx,M_dlg.m_dy,M_dlg.m_dz);
     }
     Invalidate();
     UpdateWindow();
    }
    //********************************
    //根据对话框输入的参数进行旋转变换
    //********************************
    void CTransGraphicsView::OnRotate()
    {
     // TODO: Add your command handler code here
     RoateDialog BT_dlg;
     if(IDOK == BT_dlg.DoModal())
     {
          RotateTrans(BT_dlg.m_degree,BT_dlg.m_rc);
     }
     Invalidate();
     UpdateWindow();
    }
    //**************************************************
    //         根据键盘调用相应的算法
    //其中down向下平移一个单位,up向上平移一个单位,
    //left向左平移一个单位,right向右平移一个单位
    //***************************************************
    void CTransGraphicsView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
     // TODO: Add your message handler code here and/or call default
     switch(nChar)
     {
      case VK_DOWN:
            MoveTrans(0,1,0);
      break;
      case VK_UP:
       MoveTrans(0,-1,0);
       break;
      case VK_LEFT:
             MoveTrans(-1,0,0);
       break;
      case VK_RIGHT:
       MoveTrans(1,0,0);
       break;
     }
     Invalidate();
     UpdateWindow();
     CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }
    //******************************************************
    //           根据键盘字符键调用相应的算法
    //其中x以x轴为旋转中心旋转一度,y以y轴为旋转中心旋转一度,
    //z以z轴为旋转中心旋转一度,b变大,s缩小
    //*******************************************************
    void CTransGraphicsView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
     // TODO: Add your message handler code here and/or call default
     switch(nChar)
     {
     case 'x':
            RotateTrans(1,"x");
      break;
     case 'y':
            RotateTrans(1,"y");
      break;
     case 'z':
      RotateTrans(1,"z");
      break;
     case 'b':
            BiggerOrSmallerTrans(1.1,1.1,1.1);
      break;
     case 's':
      BiggerOrSmallerTrans(0.9,0.9,0.9);
      break;
     }
     Invalidate();
     UpdateWindow();
     CView::OnChar(nChar, nRepCnt, nFlags);
    }

    发表于 @ 2005年11月07日 09:29:00|评论(loading...)|编辑

    新一篇: MFC下实现图形学之Hermite、Bezier曲线的绘制 | 旧一篇: MFC下实现图形学之多边形扫描转化填充算法

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © fuliang