详析VC中坐标系的建立

原创 2001年05月21日 10:52:00

                                       详析VC中坐标系的建立
    bull77


  建立一个合适的坐标系可以为我们的绘图带来很大的方便 。下面介绍一下如何在VC中建立我们想要的坐标系。

  一 设备坐标和逻辑坐标

  设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。

  逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下:

  1. 窗口为非滚动窗口

  2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。

  在VC中鼠标坐标的坐标位置用设备坐标表示,但所有GDI绘图都用逻

  坐标表示,所以用鼠标绘图时,那么必须将设备坐标转换为逻辑坐标,可以使用CDC 函数DptoLP()将设备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。

  二 坐标模式


  为了在不同的领域使用逻辑坐标,Windows提供了以下8种坐标模式:

  分别为MM_TEXT、MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。

 

  三 实例解析

  (一) 建立以左上角为原点,X轴和Y轴为1000的坐标,如下图

 


  我们可以用以下代码:

  void CTtView::OnDraw(CDC* pDC)
   {
    CTtDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rect;
    GetClientRect(&rect);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetViewportOrg(0,0);
    pDC->SetViewportExt(rect.right,rect.bottom);

    pDC->SetWindowOrg(0,0);
    pDC->SetWindowExt(1000,1000);

    pDC->MoveTo(50,50);
    pDC->LineTo(50,950);
    pDC->LineTo(950,950);
    pDC->LineTo(50,50);
   }

  代码分析:

  1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中

  2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式

  3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点

  4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和

   pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系

  5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同

  6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。

  7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。

  (二) 建立以视窗中心为原点的坐标,如下图

 


  用如下代码:

  void CTtView::OnDraw(CDC* pDC)
   {
    CTtDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rect;
    GetClientRect(&rect);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
    pDC->SetViewportExt(rect.right,rect.bottom);

    pDC->SetWindowOrg(0,0);
    pDC->SetWindowExt(1000,-1000);

    pDC->MoveTo(150,150);
    pDC->LineTo(-150,-200);
    pDC->LineTo(150,-150);
    pDC->LineTo(150,150);
   }

  代码分析:

  1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。

  2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。

  3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。

  

VC6自带控件画坐标曲线

http://blog.csdn.net/youoran/article/details/8460875 说明:本文将网上一些MSChart的使用方法进行了一个总结,按下面的步骤可以实现一个产生三条...
  • phenixyf
  • phenixyf
  • 2015年04月14日 17:25
  • 5406

使用VC++绘制坐标系

首先打开VC++,新建一个单文档应用程序; 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色; 在菜单中添加如下菜单; 为菜单添加消息处理函数;添加在View类...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月22日 19:22
  • 1867

在Rviz中显示坐标系方法探究

这个问题也算是一个历史遗留问题,之前在youbot的机械臂的夹子间添加了一个virtual joint,也算是添加一个坐标系了。但这个偏重于机器人模型方面的坐标。另外,在做机械臂的轨迹运动规划的时候,...
  • yaked
  • yaked
  • 2016年11月01日 16:42
  • 2206

Silverlight - Web应用的一道强光

微软发布WPF的时候,看过几个结合Vista的Demo,界面很cool,那时候的感觉是WinForm应用程序的开发要经历一场"绚烂"的升级了。 后来看到WPF/E的(WPF Everywhere)消息...
  • jameszhou
  • jameszhou
  • 2007年08月04日 12:40
  • 20205

详析VC中坐标系的建立

详析VC中坐标系的建立建立一个合适的 坐标系可以为我们的绘图带来很大的方便 。下面介绍一下如何在VC中建立我们想要的坐标系。一 设备坐标和逻辑坐标  设备坐标(Device Coordinate)又称...
  • ecjtuync
  • ecjtuync
  • 2007年01月09日 21:09
  • 808

VC建立坐标系,实现图形坐标系转换

  • 2015年08月15日 19:35
  • 263KB
  • 下载

VC++编写的画坐标系程序

  • 2008年10月07日 14:00
  • 7KB
  • 下载

vc++ 绘制坐标系

  • 2010年04月13日 20:56
  • 223KB
  • 下载

MFC 绘制简单直角坐标系

设置MFC坐标系,读懂以下函数: CRect   rect;  GetClientRect(&rect);  pDC-> SetMapMode(MM_ANISOTROPIC);  pDC-...
  • u014272404
  • u014272404
  • 2016年06月12日 16:09
  • 1655

使用VC++绘制坐标系

首先打开VC++,新建一个单文档应用程序; 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色; 在菜单中添加如下菜单; 为菜单添加消息处理函数;添加在View类...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月22日 19:22
  • 1867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:详析VC中坐标系的建立
举报原因:
原因补充:

(最多只允许输入30个字)