导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

坐标的变换问题

liufang8318 2010-07-22 02:46:17
我在对话框中建立了一个坐标系,原点定在了:

dc.SetMapMode(MM_LOENGLISH);
dc.SetViewportOrg(25,600);
现在我有一个图形的其中的坐标我也计算好啦,想要画在这个坐标系中,我是否需要将我计算出的点用CDC::LPtoDP转换下?
...全文
72 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liufang8318 2010-07-24
[Quote=引用 11 楼 windsonzhl 的回复:]
引用 9 楼 liufang8318 的回复:
绘制完之后视口原点设回去是什么意思?这个我不明白


有点无语……

如果你的DC是局部变量,那不回复属性无所谓。如果是非局部量比如CView::OnDraw(CDC* pDC)
的参数,那么在绘制之后必须将更改了的属性回复。如果只是整个图形的一个局部的绘制需要更改
DC属性,那么绘制之后也必须回复。这样说你能明白吧:)
[/Quote]好吧,虽然问题没有解决,但是是谢谢!分数给您呈上啦!
回复
当然,视口原点这个,只要不是在局部绘制过程中,不回复无所谓。

关于你10L的问题,关键是你计算点数组坐标值是基于什么单位、什么原点的。
应该基于英寸,并且原点是(0, 0)。图形数据不需要考虑原点问题。

原点问题是DC本身处理的,不管是设视口原点你还是设平移矩阵。
其它坐标变换问题也是一样。
回复
[Quote=引用 9 楼 liufang8318 的回复:]
绘制完之后视口原点设回去是什么意思?这个我不明白
[/Quote]

有点无语……

如果你的DC是局部变量,那不回复属性无所谓。如果是非局部量比如CView::OnDraw(CDC* pDC)
的参数,那么在绘制之后必须将更改了的属性回复。如果只是整个图形的一个局部的绘制需要更改
DC属性,那么绘制之后也必须回复。这样说你能明白吧:)
回复
liufang8318 2010-07-22
[Quote=引用 8 楼 windsonzhl 的回复:]
至少您对DC的使用都是正确的,除了要注意回复DC属性之外。只能怀疑问题是出在计算图形坐标的算法上了。
[/Quote]
当我用了LP和DP后图形,完全跑掉啦,与我建立的(25,600)的坐标原点关系没有,不知道什么情况?当不用这个LP和DP至少还在图形中,但是图形不对.您看?
回复
liufang8318 2010-07-22
[Quote=引用 7 楼 windsonzhl 的回复:]
哦……有点眼晕@_@

从代码上看,倒是看不出有什么问题。不知道您想画出来的图形场景是什么样的。
另外,绘制完之后将视口原点设回去了么。
[/Quote]
绘制完之后视口原点设回去是什么意思?这个我不明白
回复
至少您对DC的使用都是正确的,除了要注意回复DC属性之外。只能怀疑问题是出在计算图形坐标的算法上了。
回复
哦……有点眼晕@_@

从代码上看,倒是看不出有什么问题。不知道您想画出来的图形场景是什么样的。
另外,绘制完之后将视口原点设回去了么。
回复
liufang8318 2010-07-22
这样画出来的图形,好象也有点不太对,和我原来预想的一点也不一样!
回复
liufang8318 2010-07-22
下面是我想画图形的部分代码,您看下有什么不对吗?
dc.SetMapMode(MM_LOENGLISH);
dc.SetViewportOrg(25,600);

CPoint ptset[5];

ptset[0]=CPoint(int(m_G2+m_Za2),int(m_Ga2+m_Za2*tan(m_deltaA2*PI)));//第1点坐标;
dc.DPtoLP(&ptset[0]);
ptset[1]=CPoint(int (m_Re2*cos(m_delta2*PI)),int(m_Re2*sin(m_delta2*PI))); //第2点坐标
dc.DPtoLP(&ptset[1]);
ptset[2]=CPoint(int(((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
-m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
-m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2))),int (
((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
-m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
-m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2))*tan(m_deltaF2*PI)+
tan(m_deltaF2*PI)*(m_Gf2-m_G2)));//第3点坐标:
dc.DPtoLP(&ptset[2]);

ptset[3]=CPoint(int((((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
-m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
-m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2)))+8),
int((((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
-m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
-m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2))*tan(m_deltaF2*PI)+
tan(m_deltaF2*PI)*(m_Gf2-m_G2))-8));//第4点坐标;
dc.DPtoLP(&ptset[3]);
ptset[4]=CPoint(int((((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
-m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
-m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2)))+8),0);//第5点坐标;
dc.DPtoLP(&ptset[3]);

dc.Polyline(ptset,5);
回复
所谓DP(设备坐标)的“设备”指的是输出设备(显示器、打印机),而不是DC本身
回复
噢……没仔细看你贴的代码,不好意思:)

这样说的话,是需要的,不过应该是DPToLP,DP的单位始终是像素,也就是屏幕或客户区坐标(要看是谁的DC了)。LP即逻辑坐标,才是DC输出图形的方法所需要传入参数的坐标。
回复
liufang8318 2010-07-22
“LP和DP的转换主要是用于SetMapMode方法改变了DC坐标单位和Y轴方向之后。”
我上面的也是采用了坐标的变化啊,MM_LOENGLISH,计算出来的点,怎么在图形中乱跑啊?
回复
仅仅是原点偏移的话,不需要LP和DP的转换,一般也不需要对图形坐标数据做处理。
因为设置DC视口原点一般是用于对输出整体作偏移,比如滚屏的处理;或者每一个
局部有自己的相对坐标系。

LP和DP的转换主要是用于SetMapMode方法改变了DC坐标单位和Y轴方向之后。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……