我在对话框中建立了一个坐标系,原点定在了:dc.SetMapMode(MM_LOENGLISH);
dc.SetViewportOrg(25,600);
现在我有一个图形的其中的坐标我也计算好啦,想要画在这个坐标系中,我是否需要将我计算出的点用CDC::LPtoDP转换下?
dc.SetViewportOrg(25,600);
现在我有一个图形的其中的坐标我也计算好啦,想要画在这个坐标系中,我是否需要将我计算出的点用CDC::LPtoDP转换下?
因为设置DC视口原点一般是用于对输出整体作偏移,比如滚屏的处理;或者每一个
局部有自己的相对坐标系。LP和DP的转换主要是用于SetMapMode方法改变了DC坐标单位和Y轴方向之后。
我上面的也是采用了坐标的变化啊,MM_LOENGLISH,计算出来的点,怎么在图形中乱跑啊?
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);
有点无语……如果你的DC是局部变量,那不回复属性无所谓。如果是非局部量比如CView::OnDraw(CDC* pDC)
的参数,那么在绘制之后必须将更改了的属性回复。如果只是整个图形的一个局部的绘制需要更改
DC属性,那么绘制之后也必须回复。这样说你能明白吧:)
应该基于英寸,并且原点是(0, 0)。图形数据不需要考虑原点问题。原点问题是DC本身处理的,不管是设视口原点你还是设平移矩阵。
其它坐标变换问题也是一样。