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

📄 demoview.cpp

📁 显示地震剖面对地震专业的学生来说显示地震剖面特别重要本程序实现了地震剖面的绘制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                 // demoView.cpp : implementation of the CDemoView class
//

#include "stdafx.h"
#include <math.h>
#include "demo.h"

#include "demoDoc.h"
#include "demoView.h"
#include "SelectDLG.h"
#include "triangle.h"
#include "MainFrm.h"

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

//Arcball
ArcBallT ArcBall(640.0f, 480.0f);
Matrix4fT Transform={1.0f,0.0f,0.0f,0.0f,// NEW: Final Transform
						 0.0f,1.0f,0.0f,0.0f,
						 0.0f,0.0f,1.0f,0.0f,
						 0.0f,0.0f,0.0f,1.0f};
Matrix3fT LastRot  ={1.0f,0.0f,0.0f,	// NEW: Last Rotation
						 0.0f,1.0f,0.0f,
						 0.0f,0.0f,1.0f};
Matrix3fT ThisRot  ={1.0f,0.0f,0.0f,	// NEW: This Rotation
						 0.0f,1.0f,0.0f,
						 0.0f,0.0f,1.0f};
/////////////////////////////////////////////////////////////////////////////
// CDemoView

IMPLEMENT_DYNCREATE(CDemoView, CView)

BEGIN_MESSAGE_MAP(CDemoView, CView)
	//{{AFX_MSG_MAP(CDemoView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_COMMAND(ID_LOAD, OnLoad)
	ON_COMMAND(IDM_SHOW_POINTS, OnShowPoints)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_COMMAND(IDM_SHOW_MESH, OnShowMesh)
	ON_COMMAND(IDM_TEXTURE_MAPPING, OnTextureMapping)
	ON_COMMAND(ID_XYSHIFT, OnXyshift)
	ON_COMMAND(ID_XYROTATE, OnXyrotate)
	ON_COMMAND(ID_ZROTATE, OnZrotate)
	ON_COMMAND(ID_RESETCAM, OnResetcam)
	ON_COMMAND(ID_ANIMATE, OnAnimate)
	ON_WM_TIMER()
	ON_UPDATE_COMMAND_UI(IDM_SHOW_POINTS, OnUpdateShowPoints)
	ON_UPDATE_COMMAND_UI(IDM_SHOW_MESH, OnUpdateShowMesh)
	ON_UPDATE_COMMAND_UI(IDM_TEXTURE_MAPPING, OnUpdateTextureMapping)
	ON_UPDATE_COMMAND_UI(ID_ANIMATE, OnUpdateAnimate)
	ON_UPDATE_COMMAND_UI(ID_XYROTATE, OnUpdateXyrotate)
	ON_UPDATE_COMMAND_UI(ID_ZROTATE, OnUpdateZrotate)
	ON_UPDATE_COMMAND_UI(ID_XYSHIFT, OnUpdateXyshift)
	ON_COMMAND(ID_SHOWBACK, OnShowback)
	ON_UPDATE_COMMAND_UI(ID_SHOWBACK, OnUpdateShowback)
	ON_COMMAND(ID_SHOWINDEX, OnShowindex)
	ON_UPDATE_COMMAND_UI(ID_SHOWINDEX, OnUpdateShowindex)
	ON_COMMAND(ID_LIGHT, OnLight)
	ON_UPDATE_COMMAND_UI(ID_LIGHT, OnUpdateLight)
	ON_COMMAND(ID_ENABLESELECT, OnEnableselect)
	ON_UPDATE_COMMAND_UI(ID_ENABLESELECT, OnUpdateEnableselect)
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_COMMAND(ID_SAVERESULT, OnSaveresult)
	ON_COMMAND(ID_BACKWARD, OnBackward)
	ON_COMMAND(ID_SAVETRINDEX, OnSavetrindex)
	ON_COMMAND(ID_SHOWAXIS, OnShowaxis)
	ON_UPDATE_COMMAND_UI(ID_SHOWAXIS, OnUpdateShowaxis)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CDemoView construction/destruction

CDemoView::CDemoView()
{
	// TODO: add construction code here
	m_pDC=NULL;
	LButtonSta=FALSE;
	RButtonSta=FALSE;
	rot[0]=0;
	rot[1]=0;
	rot[2]=0;
	zoom=-4.5f;
	xyshift[0]=0;
	xyshift[1]=0;
	selectindex=-1;
	nindeleteindex=0;
	TEXTURE=FALSE;
	SHOWPOINTS=TRUE;
	SHOWTRIMESH=FALSE;
	ENABLELIGHT=FALSE;
	ENABLEXYROTATE=TRUE;
	ENABLEZROTATE=FALSE;
	ENABLEXYSHIFT=FALSE;
	ENABLEANIMATE=FALSE;
	SHOWBACK=FALSE;
	SHOWAXIS=FALSE;
	SHOWINDEX=FALSE;
	ENABLESELECT=FALSE;
	CURSORINWND=TRUE;
	CTRLKEYDOWN=FALSE;
	m_timer=0;

	dlgload.n3dpoint=0;
	dlgload.n2dpoint=0;
	dlgload.ntri=0;

	//Arcball
	isClicked=false;
	isRClicked=false;
	isDragging=false;

	//打开程序时如果"data3D.bri"文件存在,则读入数据
	//确定在程序当前目录
	LPTSTR lpszCurDir;
	TCHAR tchBuffer[128];
	CString filename,exefullpath,exefilepath;
	filename="\\data3D.bri";
	lpszCurDir=tchBuffer;
	GetModuleFileName(NULL,lpszCurDir,128);
	exefullpath=lpszCurDir;
	int pathlen=exefullpath.ReverseFind('\\');
	exefilepath=exefullpath.Left(pathlen)+filename;

	long i;
	FILE* p3dfile;
	if(p3dfile=fopen(exefilepath,"r"))
	{
		dlgload.n3dpoint=0;
		for(i=0;i<MAXPOINT;i++)
		{
			dlgload.m_point3d[i][0]=0;
			dlgload.m_point3d[i][1]=0;
			dlgload.m_point3d[i][2]=0;
			dlgload.m_point3d_old[i][0]=0;
			dlgload.m_point3d_old[i][1]=0;
			dlgload.m_point3d_old[i][2]=0;
		}
		for(i=0;i<MAXPOINT;i++)
		{
			fscanf(p3dfile,"%f",&dlgload.m_point3d[i][0]);
			fscanf(p3dfile,"%f",&dlgload.m_point3d[i][1]);	
			fscanf(p3dfile,"%f",&dlgload.m_point3d[i][2]);
			dlgload.m_point3d_old[i][0]=dlgload.m_point3d[i][0];
			dlgload.m_point3d_old[i][1]=dlgload.m_point3d[i][1];
			dlgload.m_point3d_old[i][2]=dlgload.m_point3d[i][2];
			if((dlgload.m_point3d[i][0]==0)&&(dlgload.m_point3d[i][1]==0)&&(dlgload.m_point3d[i][2]==0))
				break;
			dlgload.n3dpoint++;
		}
		fclose(p3dfile);
		if(dlgload.n3dpoint==MAXPOINT)
		{
			MessageBox("数据点数量超过程序最大可显示数量,可能导致图像显示不完整!",NULL,
			MB_ICONWARNING|MB_SYSTEMMODAL);
			return;
		}

		//归一化3D点坐标,使其形心在原点且各顶点到形心的平均距离为1
		//计算xyz三坐标的均值
		float mean[3]={0,0,0};
		for(i=0;i<dlgload.n3dpoint;i++)
		{
			mean[0]+=dlgload.m_point3d[i][0];
			mean[1]+=dlgload.m_point3d[i][1];
			mean[2]+=dlgload.m_point3d[i][2];
		}
		mean[0]=mean[0]/dlgload.n3dpoint;
		mean[1]=mean[1]/dlgload.n3dpoint;
		mean[2]=mean[2]/dlgload.n3dpoint;
		//使点的形心在原点
		for(i=0;i<dlgload.n3dpoint;i++)
		{
			dlgload.m_point3d[i][0]=dlgload.m_point3d[i][0]-mean[0];
			dlgload.m_point3d[i][1]=dlgload.m_point3d[i][1]-mean[1];
			dlgload.m_point3d[i][2]=dlgload.m_point3d[i][2]-mean[2];
		}
		//使它们到原点的平均距离的平方是1
		float meandis=0;
		for(i=0;i<dlgload.n3dpoint;i++)
		{
			meandis+=(float)pow(dlgload.m_point3d[i][0]*dlgload.m_point3d[i][0]+dlgload.m_point3d[i][1]*dlgload.m_point3d[i][1]+dlgload.m_point3d[i][2]*dlgload.m_point3d[i][2],0.5);
		}
		meandis=meandis/dlgload.n3dpoint;
		for(i=0;i<dlgload.n3dpoint;i++)
		{
			dlgload.m_point3d[i][0]=dlgload.m_point3d[i][0]/meandis;
			dlgload.m_point3d[i][1]=dlgload.m_point3d[i][1]/meandis;
			dlgload.m_point3d[i][2]=dlgload.m_point3d[i][2]/meandis;
		}
	}
}

CDemoView::~CDemoView()
{
	//delete dlgload.triangle;
}

BOOL CDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView drawing

void CDemoView::OnDraw(CDC* pDC)
{
	CDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	DrawScene(GL_RENDER);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDemoView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDemoView message handlers

int CDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	Init();

	return 0;
}

void CDemoView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	HGLRC hrc;
	hrc=::wglGetCurrentContext();   //得到当前RC句柄
	::wglMakeCurrent(NULL,NULL);    //使当前RC无效

	if(hrc)
		::wglDeleteContext(hrc);    //删除当前RC

	if(m_pDC)
		delete m_pDC;               //删除当前DC			
}

void CDemoView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if(cy>0)
	{
		if((m_oldRect.right>cx)|(m_oldRect.bottom>cy))
		RedrawWindow();

		m_oldRect.right=cx;
		m_oldRect.bottom=cy;

		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPerspective(45,(GLdouble)cx/(GLdouble)cy,0.1,1000.0);
		glViewport(0,0,cx,cy);

		ArcBall.setBounds(cx,cy);
	}
	Invalidate();		
}

void CDemoView::Init()
{
	PIXELFORMATDESCRIPTOR pfd;
	int n;
	HGLRC hrc;

	m_pDC=new CClientDC(this);//得到当前窗口DC

	ASSERT(m_pDC!=NULL);      //诊断信息

    //设置象素格式
	if(!bSetupPixelFormat()) return;

    //测试象素格式
	n=::GetPixelFormat(m_pDC->GetSafeHdc());//得到当前DC象素格式索引
	::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);//设置象素格式

    //创建与当前DC兼容的RC
	hrc=wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);//使RC当前化

	GetClientRect(&m_oldRect);

	//创建光源
    GLfloat light_position0[]={0.0f,0.0f,-9.0f,0.0f};
    GLfloat light_position1[]={0.0f,0.0f,9.0f,0.0f};
	GLfloat light_diffuse[]={1.0f,1.0f,1.0f,0.0f};
    glLightfv(GL_LIGHT0,GL_POSITION,light_position0);
	glLightfv(GL_LIGHT1,GL_POSITION,light_position1);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
	glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
	glEnable(GL_LIGHT1);
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);//启动双面光照(important!)

	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

BOOL CDemoView::bSetupPixelFormat()
{
	static PIXELFORMATDESCRIPTOR pfd=          //初始化象素格式结构体
	{
		sizeof(PIXELFORMATDESCRIPTOR),         //size of this pdf
		1,                                     //version number
        PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, ////support window & opengl
		PFD_TYPE_RGBA,                         //RGBA type
		24,                                    //24-bit color depth
		0,0,0,0,0,0,                           //colot bits ignored
		0,                                     //no alpha buffer
		0,                                     //shift bit ignored
		0,                                     //no accumulation buffer
		0,0,0,0,                               //accum bits ignored
		32,                                    //32-bits z-buffer
		0,                                     //no stencil buffer
		0,                                     //no auxiliary buffer
		PFD_MAIN_PLANE,                        //main layer
		0,                                     //reserved
		0,0,0                                  //layer masks ignored
	};
	int pixelformat;
    //从当前DC支持的象素格式中选择与pfd所指定最匹配一个,返回其索引
	if((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
	{
		MessageBox("ChoosePixelFormat failed");
		return FALSE;
	}
    //把指定DC象素格式设置成由索引指向的象素格式
	if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
	{
		MessageBox("SetPixelFormat failed");
		return FALSE;
	}

	return TRUE;
}

void CDemoView::DrawScene(GLenum mode)
{
	glClearColor(0.7f,0.7f,0.9f,0.0f);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	
	if(ENABLELIGHT==TRUE)//启用光照
		glEnable(GL_LIGHTING);
	else
		glDisable(GL_LIGHTING);

	if(SHOWBACK==TRUE)//背面不可见
	{
		glFrontFace(GL_CW);//顺时针为正
		glPolygonMode(GL_BACK,GL_LINE);
		//glEnable(GL_CULL_FACE);
		//glCullFace(GL_FRONT);
	}
	else
	{
		glPolygonMode(GL_BACK,GL_FILL);
		//glCullFace(GL_FALSE);
		//glDisable(GL_CULL_FACE);
	}

	glShadeModel(GL_SMOOTH);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(xyshift[0],xyshift[1],zoom);//平移

	//Arcball rotate control
	glPushMatrix();

⌨️ 快捷键说明

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