理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt

按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows的map mode,就会走弯路。其实,稍微改变一下观念,windows的map mode就比较好理解了。举例说明:

page space---->device space
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(40,0);  //这句“设定”page space的原点为(40,0),注意,
//这时(40,0)就是原点,原点就是(40,0)这个点,其实,(0,0)与原点没有必然联系。这
//一句对下面的画图函数在page space中所作的图不会有任何影响。一句话:SetWindowOrg
//就是指定一下,page space中哪个点为原点。
pDC->Rectangle(0,0,100,-100);
pDC->Rectangle(0,-100,50,-200);

同理,SetViewportOrg也是指定一下,device space中哪个点为原点,两个坐标系映射时,两个原点重合。

SetWindowExt设定page space的大小,SetViewportOrg设定device space的大小,其实,真正有意义的只是两者的比例关系,例如,在一个1024*768的显示屏上:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(10240,7680);
pDC->SetViewportExt(1024,768);
pDC->Rectangle(0,0,100,100);

  就会画一个10 pixels*10 pixels的矩形。其本质就是,X方向,每个逻辑单位有1024/10240个象素,Y方向每个逻辑单位有768/7680个象素。因此,下面的代码有相同的作用:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(102400,76800);
pDC->SetViewportExt(10240,7680);
pDC->Rectangle(0,0,100,100);

两者本质一样,前者更易于理解。

SetViewportOrg设定device space的大小,SetViewportOrg好像是设置视口的原点的。其实如何把逻辑窗口和设备窗口看成两个屏幕的话SetWindowOrg()在逻辑和设备窗口重合的基础上移动了一次设备窗口
而SetViewportOrg() 又移动了一次在设备窗口上的原点的位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MFC 中,可以使用 CDC 类来进行图形绘制和几何变换操作。下面是一个示例代码,演示如何绘制一个任意多边形,并进行基本几何变换操作: ```cpp void DrawPolygon(CDC* pDC, CPoint* pts, int count) { // 绘制多边形 pDC->Polygon(pts, count); // 平移变换 pDC->OffsetViewportOrg(100, 100); // 缩放变换 pDC->ScaleViewportExt(2, 2, 1, 1); // 旋转变换 pDC->SetViewportOrg(0, 0); pDC->SetViewportExt(200, 200); pDC->SetWindowOrg(100, 100); pDC->SetWindowExt(200, 200); pDC->SetViewportOrg(150, 150); pDC->SetViewportExt(200, 200); pDC->RotateViewport(45); // 反射变换 pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetViewportExt(200, -200); // 错切变换 pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(200, 200); pDC->SetViewportExt(200, 200); pDC->SetViewportOrg(0, 0); pDC->SetWindowOrg(0, 0); pDC->ModifyWorldTransform(&XFORM{1, 0, 1, 1, 0, 0}, MWT_LEFTMULTIPLY); } ``` 在这个示例代码中,我们首先使用 `Polygon` 函数绘制了一个任意多边形,然后分别进行了平移、缩放、旋转、反射和错切等几何变换操作。 注意到在进行旋转变换时,我们使用了 `SetViewportOrg`、`SetViewportExt`、`SetWindowOrg` 和 `SetWindowExt` 函数,以便将旋转中心点设置为多边形的中心点,并将坐标系变换到合适的位置。 在反射变换和错切变换中,我们使用了 `SetMapMode` 函数来设置坐标系的映射模式,以便实现反射和错切变换。 最后,在错切变换中,我们使用了 `ModifyWorldTransform` 函数来修改世界变换矩阵,实现任意的错切变换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值