⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 terrein1view.cpp

📁 用VC做的地貌晕渲的程序
💻 CPP
字号:
// Terrein1View.cpp : implementation of the CTerrein1View class
//

#include "stdafx.h"
#include "Terrein1.h"

#include "Terrein1Doc.h"
#include "Terrein1View.h"
#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTerrein1View

IMPLEMENT_DYNCREATE(CTerrein1View, CView)

BEGIN_MESSAGE_MAP(CTerrein1View, CView)
	//{{AFX_MSG_MAP(CTerrein1View)
	ON_COMMAND(ID_DRAWDEM, OnDrawdem)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CTerrein1View construction/destruction

CTerrein1View::CTerrein1View()
{
	tag=0;
	// TODO: add construction code here

}

CTerrein1View::~CTerrein1View()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTerrein1View drawing

void CTerrein1View::OnDraw(CDC* pDC)
{
	CTerrein1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

    if(tag==1)
	{
	/*CRect rect;
    GetClientRect(&rect);
	int nWidth=rect.Width();
	int nHeight=rect.Height();

      CDC MemDC; //首先定义一个显示设备对象
      CBitmap MemBitmap;//定义一个位图对象
      //随后建立与屏幕显示兼容的内存显示设备
      MemDC.CreateCompatibleDC(NULL);
      //这时还不能绘图,因为没有地方画 ^_^
      //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
      MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
      //将位图选入到内存显示设备中
      //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
      CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
      //先用背景色将位图清除干净,这里我用的是白色作为背景
      //你也可以用自己应该用的颜色
      MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));*/
      //绘图
     DrawDEM(pDC);
      //MemDC.MoveTo(……);
      //MemDC.LineTo(……);
      //将内存中的图拷贝到屏幕上进行显示
      //pDC->BitBlt(0,0,nWidth*10/bl1,nHeight*10/bl2,&MemDC,0,0,SRCCOPY);
      //////绘图完成后的清理
      //MemBitmap.DeleteObject();
      //MemDC.DeleteDC();
	}

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

/////////////////////////////////////////////////////////////////////////////
// CTerrein1View printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTerrein1View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTerrein1View message handlers

void CTerrein1View::LoadFile(CString filename)
{

	FILE *fp = NULL;

	// 以只读/二进制模式打开文件
    fp = fopen(filename, "r" );

	// 判断文件是否存在
	if (fp == NULL )	
	{
		// 如果文件没有打开,显示错误信息
		MessageBox("can't open file");
		exit(0);;
	}
    char message[300];
	fscanf(fp,"%s",message);
	if(lstrcmpi(message,"NSDTF-DEM")!=0)
	{
		AfxMessageBox("当前DEM文件非国家空间数据交换格式!");
	    return;
	}
    fscanf(fp,"%s",message);
    fscanf(fp,"%s",message);
	fscanf(fp,"%s",message);
	fscanf(fp,"%s",message);

    fscanf(fp,"%f",&m_fLeftTopX);
    fscanf(fp,"%f",&m_fLeftTopY);
    fscanf(fp,"%f",&m_fGridX);
  
    fscanf(fp,"%f",&m_fGridY);
    fscanf(fp,"%d",&m_nRow);
    fscanf(fp,"%d",&m_nCol);
    fscanf(fp,"%f",&m_nScale);
    
    if(fabs(m_fGridX-m_fGridY)>0.0001)
	{
	AfxMessageBox("系统要求DEM为正方形格网");
	return; 	
	}

    pHeightMap=new double*[m_nRow];
	for(int t=0;t<m_nRow;t++)
	{
		pHeightMap[t]=new double[m_nCol];
	}
    int i,j,a,b,c,d;
	long height;
    for(i=0;i<m_nRow;i++)
	  for(j=0;j<m_nCol;j++)
	  {
		  fscanf(fp,"%d",&height);
		
		  pHeightMap[i][j]=height;
		 
	  }
	  fclose(fp);
 }
	
void CTerrein1View::DrawDEM(CDC *pDC)
{
	int i,j,color;
	float az,bz;
	float ax,by;
	ax=22.5;
	by=22.5;
	

    for(i=0;i<m_nRow-1;i++)
	  for(j=0;j<m_nCol-1;j++)
	  {
		  bz=((pHeightMap[i][j]-pHeightMap[i+1][j])+(pHeightMap[i][j+1]-pHeightMap[i+1][j+1]))/2;
		  az=((pHeightMap[i][j+1]-pHeightMap[i][j])+(pHeightMap[i+1][j+1]-pHeightMap[i+1][j]))/2;
	      long D=sqrt(az*az*by *by+ax*ax*bz*bz+ax*ax*by*by);
		  double s=sqrt(3)/3;
		  double D1=-s*az*by+s*ax*bz-s*ax*by;
		  double cos=D1/D;
		  //double k=log(1/fabs(cos));



          if(cos>=0)
		  {
			  int rank=(int)(cos/0.2);

			  
			  color=RGB(180-(5-rank)*15,220-(5-rank)*12,150-(5-rank)*15);
		  }
		  else 
		  {
			  int rank=(int)(-cos/0.2);
			  color=RGB(105-8*rank,145-8*rank,75-8*rank);
		  }
		 

         // CPen *pOldPen;
		  //CPen SolidPen(PS_SOLID,1,color);
		  //pOldPen=pDC->SelectObject(&SolidPen);
          //CBrush *pOldBrush;
		  //CBrush brush1(color);
		  //pOldBrush=pDC->SelectObject(&brush1);
		  pDC->SetPixel(j,i,color);//Rectangle(j*m_fGridX,i*m_fGridY,(j+1)*m_fGridX,(i+1)*m_fGridY);
		  //pDC->SelectObject(pOldBrush);
		 // pDC->SelectObject(pOldPen);
	  }
	      

}


		  


void CTerrein1View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
	/*if(tag==1)
	{
		CRect rc;
	    GetClientRect(&rc);
	    int nWidth=(int)m_nCol*m_fGridX;
	    int nHeight=(int)m_nRow*m_fGridY;
	    pDC->SetMapMode(MM_ISOTROPIC);
        pDC->SetViewportOrg(rc.left,rc.bottom);
	    pDC->SetWindowOrg(0,0);
	    pDC->SetViewportExt(rc.right-rc.left,-(rc.bottom-rc.top));
	    pDC->SetWindowExt(nWidth,nHeight);

	    //bl1=(float)(rc.right-rc.left)/(float)nWidth;
     	//bl2=(float)(rc.bottom-rc.top)/(float)nHeight;
	}*/
// TODO: Add your specialized code here and/or call the base class
	
	CView::OnPrepareDC(pDC, pInfo);
}

void CTerrein1View::OnDrawdem() 
{	
	tag=1;
    LoadFile("d:\\40803.dem");
	Invalidate();


	// TODO: Add your command handler code here
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -