坐标系转换,客户区坐标转换成逻辑…

原创 2013年12月02日 15:13:56

客户区坐标转换成逻辑坐标或其它你想要的坐标。

转换坐标核心代码如下,其中最关键的一步为pDC->SetMapMode(MM_LOMETRIC);设置映射模式

CMyDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 CPen pen(1,5,RGB(0x7A,0x7A,0x7A));
 CClientDC *pDC = new CClientDC(this);

//设置映射模式,单位为0.1mm,引时窗口坐标系以客户区左上角为原点,

                //X轴的方向为从左往右,Y轴的方向为从下往上

 pDC->SetMapMode(MM_LOMETRIC);
 pDC->SelectObject(&pen);
//获得客户区域
 CRect rect;
 GetClientRect(&rect);
//将客户坐标转换为逻辑坐标,
 pDC->DPtoLP(&rect);
//在逻辑坐标下,意图将视口原点所置的位置
 CSize org(200,-rect.bottom-200);
//将该位置转换为设置坐标,方便移动视口坐标原点
 pDC->LPtoDP(&org);

 

 

以上是绘制直角坐标系的部分代码,全部cpp文件代码如下。

 

 

 

// 直角坐标系View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "直角坐标系.h"

#include "直角坐标系Doc.h"
#include "直角坐标系View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
 //{{AFX_MSG_MAP(CMyView)
  // NOTE - the ClassWizard will add and remove mapping macros here.
  //    DO NOT EDIT what you see in these blocks of generated code!
 //}}AFX_MSG_MAP
 // Standard printing commands
 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
 // TODO: add construction code here

}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pD)
{
 int x_min=10;// x轴起始座标                                                      
    int x_step=10;// 显示间隔
    int y_min=10;// y轴起始座标
    int y_step=10;// 显示间隔
 CMyDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 CPen pen(1,5,RGB(0x7A,0x7A,0x7A));
 CClientDC *pDC = new CClientDC(this);

//设置映射模式,单位为0.1mm,引时窗口坐标系以客户区左上角为原点,

                //X轴的方向为从左往右,Y轴的方向为从下往上

 pDC->SetMapMode(MM_LOMETRIC);
 pDC->SelectObject(&pen);
//获得客户区域
 CRect rect;
 GetClientRect(&rect);
//将客户坐标转换为逻辑坐标,
 pDC->DPtoLP(&rect);
//在逻辑坐标下,意图将视口原点所置的位置
 CSize org(200,-rect.bottom-200);
//将该位置转换为设置坐标,方便移动视口坐标原点
 pDC->LPtoDP(&org);
//移动视口坐标原点,整个坐标尺在可见区域
 pDC->SetViewportOrg(org.cx,org.cy);
//在逻辑坐标系下画X轴,起点为逻辑坐标系下的原点,终点为自定的
 pDC->MoveTo(0,0);
//X轴的长度为客户区的宽度减去5厘米(一个象素单位为0.1mm),此时X轴终点距右边框的距离将为3cm(视口原点已经移
//动到距左边框2cm处)
 pDC->LineTo(rect.right*2/3,0);


 pDC->MoveTo(rect.right*2/3,0);
 pDC->LineTo(rect.right*2/3-50,20);
 pDC->MoveTo(rect.right*2/3,0);
 pDC->LineTo(rect.right*2/3-50,-20);
 pDC->TextOut(rect.right*2/3,0,L"X");


//在逻辑坐标系下画Y轴,起点为逻辑坐标系下的原点,终点为自定的
 pDC->MoveTo(0,0);
//Y轴的长度为客户区的高度减去5厘米(一个象素单位为0.1mm),此时Y轴终点距上边框的距离将为3cm(视口原点已经移
//动到距下边框2cm处)
 pDC->LineTo(0,-rect.bottom-500);
//以下代码用来画Y轴的终点箭头
 pDC->MoveTo(-20,-rect.bottom-540);
 pDC->LineTo(0,-rect.bottom-500);
 pDC->MoveTo(20,-rect.bottom-540);
 pDC->LineTo(0,-rect.bottom-500);
 pDC->TextOut(0,-rect.bottom-400,_T("Y"));
//在画标尺时,刻度的最大单位为cm,最小单位为mm,坐标轴上只画有整数个cm段,并在相应的位置标明cm刻度
//计算X轴可以画出多少个cm刻度
 int num = (rect.right+1000)/200;
//利用循环画X轴上的刻度,i表示第多少个mm刻度,总共为num*10个毫米刻度
 int k=x_min;
 for(int i = 0;i<=num*10; i++)
 {

//刻度能为5整除,此时的可能值为:5,10,15……
  if(i%5==0)
   


//刻度为10的倍数时,画出刻度标记,它的长度为4mm,并在刻度的下方标明刻度值,单位为cm
   if((i ==0)&&(k%x_step==0)) // 间隔为step,默认为20
   {
    pDC->MoveTo(i*10,0);
    pDC->LineTo(i*10,40);
    CString str;
    str.Format(_T("%d"),k);  // 显示刻度
    pDC->TextOut(i*10-10,-10,str);
    k+=x_step;
   }
   else//刻度为5,15等时,画出刻度标记,它的长度为2mm
   {
    pDC->MoveTo(i*10,0);
    pDC->LineTo(i*10,20);
   }

  }
 }


//计算Y轴可以画出多少个cm刻度
 num = (-rect.bottom-500)/100;
 k=y_step;
//相用画X轴上的坐标相同的方法来绘制Y轴坐标,此时注意绘画点的改变
 for(int j = 1;j<=num*10; j++)
 {
  if(j%5==0)
  {
   if((j ==0)&&(k%y_step==0))
   {
    pDC->MoveTo(0,j*10);
    pDC->LineTo(40,j*10);
    CString str;
    str.Format(_T("%d"),k);
    pDC->TextOut(-45,j*10+10,str);
    k+=y_step;
   }
   else
   {
    pDC->MoveTo(0,j*10);
    pDC->LineTo(20,j*10);
   }
  }
 }


 delete pDC;

 // TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
 // default preparation
 return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* , CPrintInfo* )
{
 // TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* , CPrintInfo* )
{
 // TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
 CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
 return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

 

程序运行结果图如下:

坐标系转换,客户区坐标转换成逻辑坐标

欢迎访问我的小站 船长旅游网,百度搜索  船长旅游网

相关文章推荐

如何将谷歌地图高清卫星影像坐标系转换成西安80坐标(WGS84)

如何将下载的影像变换为西安80坐标?                 利用ARCGIS进行自定义坐标系和投影转换                 ARCGIS种通过三参数和其参数进行精确投影转换 ...
  • bigemap
  • bigemap
  • 2016年09月13日 12:00
  • 51120

ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而...

百度地图将地图坐标转换成页面像素

最近使用百度地图做数据显示,但是使用自己定义的图片以及便签必须在页面上面定位才能达到效果,这必然就需要使用到像素坐标,网上百度许久,找到了一套可行的方法,以下代码测试可用,如有需要的伙伴可以参考/**...

openGL将三维坐标转换成二维坐标在…

数据:利用kinect已经将人体骨架的三维坐标提取出来,并保存在一个txt文档里面 目的:将三维坐标在屏幕上显示出来。 工具:openGL   通过查阅资料和老师的指导,如果想把三维坐标在屏幕上显示出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:坐标系转换,客户区坐标转换成逻辑…
举报原因:
原因补充:

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