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

📄 demoview.cpp

📁 显示地震剖面对地震专业的学生来说显示地震剖面特别重要本程序实现了地震剖面的绘制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			SetCursor(hCursor);
			CURSORINWND=true;
		}
		else if(CURSORINWND&&!m_oldRect.PtInRect(point))
		{
			::ReleaseCapture();
			CURSORINWND=FALSE;
		}
		//进入选择\删除模式
		else if(CURSORINWND&&m_oldRect.PtInRect(point)&&!LButtonSta&&!RButtonSta)
		{
			DoSelect(point);
		}
	}

	if(LButtonSta==TRUE&&!CTRLKEYDOWN)//旋转+平移
	{
//		if(ENABLEXYROTATE==TRUE)
//		{
//		    rot[0]+=(mouseX-point.x);//X
//		    rot[1]+=(mouseY-point.y);//Y
//		}
//		else if(ENABLEZROTATE==TRUE)
//		{
//		    rot[2]+=(mouseX-point.x);//Z
//		}

		if(ENABLEXYSHIFT==TRUE)//平移
		{
		    xyshift[0]-=(mouseX-point.x)/100.0f;
		    xyshift[1]+=(mouseY-point.y)/100.0f;
		}
		else//旋转
		{
			//Arcball rotate control
			Quat4fT ThisQuat;
			MousePt.s.X=point.x;
			MousePt.s.Y=point.y;
			ArcBall.drag(&MousePt,&ThisQuat);// Update End Vector And Get Rotation As Quaternion
			Matrix3fSetRotationFromQuat4f(&ThisRot, &ThisQuat);// Convert Quaternion Into Matrix3fT
			Matrix3fMulMatrix3f(&ThisRot, &LastRot);// Accumulate Last Rotation Into This One
			Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot);
		}
	}
	else if(RButtonSta==TRUE&&!CTRLKEYDOWN)//缩放
	{
		zoom-=(mouseY-point.y)/4.0f;
	}
	mouseX=point.x;
	mouseY=point.y;
	
	if(ENABLEANIMATE==FALSE)
	    Invalidate(FALSE);
	
	CView::OnMouseMove(nFlags, point);
}
void CDemoView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(!CTRLKEYDOWN)
	{
		::ReleaseCapture();
		if(ENABLESELECT&&CURSORINWND)
		{
			SetCapture();
			HCURSOR hCursor;
			hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR3);
			SetCursor(hCursor);
		}
	}
	
	LButtonSta=FALSE;
	CView::OnLButtonUp(nFlags, point);
}
void CDemoView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(!ENABLESELECT)
	{
		SetCapture();
		HCURSOR hCursor;
		hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR2);
		SetCursor(hCursor);
	}
	else if(!CTRLKEYDOWN)
	{
		::ReleaseCapture();

		SetCapture();
		HCURSOR hCursor;
		hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR2);
		SetCursor(hCursor);
	}

	RButtonSta=TRUE;
	mouseX=point.x;
	mouseY=point.y;
	
	CView::OnRButtonDown(nFlags, point);
}
void CDemoView::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(!CTRLKEYDOWN)
	{
		::ReleaseCapture();
		if(ENABLESELECT&&CURSORINWND)
		{
			SetCapture();
			HCURSOR hCursor;
			hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR3);
			SetCursor(hCursor);
		}
	}
	
	RButtonSta=FALSE;
	CView::OnRButtonUp(nFlags, point);
}
void CDemoView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	rot[0]+=1;
	rot[1]+=1;
	rot[2]+=2;
	Invalidate(FALSE);
	
	CView::OnTimer(nIDEvent);
}
void CDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar==0x11)//判断是否是CTRL键
		CTRLKEYDOWN=TRUE;
	
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar==0x11)//判断是否是CTRL键
		CTRLKEYDOWN=FALSE;
	
	CView::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CDemoView::OnBackward() 
{
	// TODO: Add your command handler code here
	if(nindeleteindex>0)
	{
		//重组恢复删除点后的顶点数组
		dlgload.m_point2d[deleteindex[nindeleteindex-1]][0]=deletecontent[nindeleteindex-1][0];
		dlgload.m_point2d[deleteindex[nindeleteindex-1]][1]=deletecontent[nindeleteindex-1][1];
		dlgload.n2dpoint++;
		dlgload.m_point3d[deleteindex[nindeleteindex-1]][0]=deletecontent[nindeleteindex-1][2];
		dlgload.m_point3d[deleteindex[nindeleteindex-1]][1]=deletecontent[nindeleteindex-1][3];
		dlgload.m_point3d[deleteindex[nindeleteindex-1]][2]=deletecontent[nindeleteindex-1][4];
		dlgload.n3dpoint++;

		//对恢复后的点进行三角化
		int kk=0;
		int &numberoftriangle=kk;		
		int vertexindex[100000];

		dlgload.triangulation(dlgload.m_point2d,dlgload.n2dpoint,vertexindex,numberoftriangle);
		dlgload.ntri=numberoftriangle;

		for(int i=0;i<dlgload.ntri;i++)
		{
			for(int j=0;j<3;j++)
				dlgload.triangle[i][j]=vertexindex[i*3+j];		
		}

		//为撤销恢复操作作准备
		if(nindeleteindex>0)
		{
			nindeleteindex--;
		}
		else
			nindeleteindex=0;

		Invalidate(FALSE);
	}
}
void CDemoView::OnSaveresult() 
{
	// TODO: Add your command handler code here
	FILE* presult;
	presult=fopen("3d_data_md.txt","w");
	for(int i=0;i<dlgload.n3dpoint;i++)
	{
		fprintf(presult,"%f %f %f\n",dlgload.m_point3d[i][0],dlgload.m_point3d[i][1],dlgload.m_point3d[i][2]);
	}
	presult=fopen("matches_md.txt","w");
	for(i=0;i<dlgload.n2dpoint;i++)
	{
		fprintf(presult,"%f %f\n",dlgload.m_point2d[i][0],dlgload.m_point2d[i][1]);
	}
	fclose(presult);	
}
void CDemoView::OnSavetrindex() 
{
	// TODO: Add your command handler code here
	FILE* presult;
	presult=fopen("trindex.txt","w");
	for(int i=0;i<dlgload.ntri;i++)
	{
		fprintf(presult,"%d %d %d\n",dlgload.triangle[i][0],dlgload.triangle[i][1],dlgload.triangle[i][2]);
	}
	fclose(presult);
}

//setcheckbox函数////////////////////////////////////////////////////////
void CDemoView::OnUpdateShowPoints(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(SHOWPOINTS);
}
void CDemoView::OnUpdateShowMesh(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(SHOWTRIMESH);
}
void CDemoView::OnUpdateTextureMapping(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(TEXTURE);
}
void CDemoView::OnUpdateXyrotate(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(ENABLEXYROTATE);
}
void CDemoView::OnUpdateZrotate(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(ENABLEZROTATE);
}
void CDemoView::OnUpdateXyshift(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(ENABLEXYSHIFT);
}
void CDemoView::OnUpdateAnimate(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(ENABLEANIMATE);
}
void CDemoView::OnUpdateShowback(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(!SHOWBACK);
}
void CDemoView::OnUpdateShowaxis(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(SHOWAXIS);
}
void CDemoView::OnUpdateShowindex(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(SHOWINDEX);
}
void CDemoView::OnUpdateLight(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(ENABLELIGHT);
}
void CDemoView::OnUpdateEnableselect(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(ENABLESELECT);
}

//其他函数/////////////////////////////////////////////////////////////
//计算三角面片的法向量(用于光照)
void CDemoView::CaculateNormal(GLdouble* dVertex1,GLdouble* dVertex2,
							   GLdouble* dVertex3,GLdouble* dNormal)
{
	GLdouble dVector1[3],dVector2[3];
	dVector1[0]=dVertex2[0]-dVertex1[0];
	dVector1[1]=dVertex2[1]-dVertex1[1];
	dVector1[2]=dVertex2[2]-dVertex1[2];
	dVector2[0]=dVertex3[0]-dVertex1[0];
	dVector2[1]=dVertex3[1]-dVertex1[1];
	dVector2[2]=dVertex3[2]-dVertex1[2];

	dNormal[0]=dVector1[1]*dVector2[2]-dVector1[2]*dVector2[1];
	dNormal[1]=dVector1[2]*dVector2[0]-dVector1[0]*dVector2[2];
	dNormal[2]=dVector1[0]*dVector2[1]-dVector1[1]*dVector2[0];

	double dNormalLength=sqrt(dNormal[0]*dNormal[0]+
		                      dNormal[1]*dNormal[1]+dNormal[2]*dNormal[2]);
	if(dNormalLength!=0.0)
	{
		dNormal[0]=dNormal[0]/dNormalLength;
		dNormal[1]=dNormal[1]/dNormalLength;
		dNormal[2]=dNormal[2]/dNormalLength;
	}
	else
	{
		dNormal[0]=0.0;
		dNormal[1]=0.0;
		dNormal[2]=1.0;
	}
}
//开始选择
void CDemoView::DoSelect(CPoint point)
{
	GLint hits;
	GLint vp[4];
	
	glGetIntegerv (GL_VIEWPORT,vp);
	
	glSelectBuffer(1000,selectBuf);
	glRenderMode(GL_SELECT);
	glInitNames();
	glPushName(~0);

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
		glLoadIdentity();
		gluPickMatrix(point.x,vp[3]-point.y,3,3,vp);
		gluPerspective(45,(GLdouble)m_oldRect.right/(GLdouble)m_oldRect.bottom,0.1,1000.0);
		glMatrixMode(GL_MODELVIEW);
		DrawScene(GL_SELECT);
	glPopMatrix();
	glFlush();

	hits=glRenderMode(GL_RENDER);
	if(hits)
	{
		int n=0;double minz=selectBuf[1];
		for(int i=1;i<hits;i++)
		{
			if (selectBuf[1+i*4]<minz) {n=i;minz=selectBuf[1+i*4];}
		}
		selectindex=selectBuf[n*4+3];
	}

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glViewport(0,0,m_oldRect.right,m_oldRect.bottom);
	gluPerspective(45,(GLdouble)m_oldRect.right/(GLdouble)m_oldRect.bottom,0.1,1000.0);
}
//删除选择的点
void CDemoView::DeletePnt()
{
	if(dlgload.n3dpoint!=0)
	{
		//为撤销恢复操作作准备
		nindeleteindex++;
		if(nindeleteindex==6)
		{
			for(int i=0;i<4;i++)
			{
				deleteindex[i]=deleteindex[i+1];
				deletecontent[i][0]=deletecontent[i+1][0];
				deletecontent[i][1]=deletecontent[i+1][1];
				deletecontent[i][2]=deletecontent[i+1][2];
				deletecontent[i][3]=deletecontent[i+1][3];
				deletecontent[i][4]=deletecontent[i+1][4];
			}
			deleteindex[4]=selectindex;
			if(dlgload.n2dpoint!=0)
			{
				deletecontent[4][0]=dlgload.m_point2d[selectindex][0];
				deletecontent[4][1]=dlgload.m_point2d[selectindex][1];
				deletecontent[4][2]=dlgload.m_point3d[selectindex][0];
				deletecontent[4][3]=dlgload.m_point3d[selectindex][1];
				deletecontent[4][4]=dlgload.m_point3d[selectindex][2];
				nindeleteindex--;
			}
			else
			{
				deletecontent[4][0]=0;
				deletecontent[4][1]=0;
				deletecontent[4][2]=dlgload.m_point3d[selectindex][0];
				deletecontent[4][3]=dlgload.m_point3d[selectindex][1];
				deletecontent[4][4]=dlgload.m_point3d[selectindex][2];
				nindeleteindex--;			}
		}
		else
		{
			if(dlgload.n2dpoint!=0)
			{
				deleteindex[nindeleteindex-1]=selectindex;
				deletecontent[nindeleteindex-1][0]=dlgload.m_point2d[selectindex][0];
				deletecontent[nindeleteindex-1][1]=dlgload.m_point2d[selectindex][1];
				deletecontent[nindeleteindex-1][2]=dlgload.m_point3d[selectindex][0];
				deletecontent[nindeleteindex-1][3]=dlgload.m_point3d[selectindex][1];
				deletecontent[nindeleteindex-1][4]=dlgload.m_point3d[selectindex][2];
			}
			else
			{
				deleteindex[nindeleteindex-1]=selectindex;
				deletecontent[nindeleteindex-1][0]=0;
				deletecontent[nindeleteindex-1][1]=0;
				deletecontent[nindeleteindex-1][2]=dlgload.m_point3d[selectindex][0];
				deletecontent[nindeleteindex-1][3]=dlgload.m_point3d[selectindex][1];
				deletecontent[nindeleteindex-1][4]=dlgload.m_point3d[selectindex][2];
			}

		}

		//重组删除点后的顶点数组
		if(dlgload.n2dpoint!=0)
		{
			dlgload.m_point2d[selectindex][0]=dlgload.m_point2d[dlgload.n2dpoint-1][0];
			dlgload.m_point2d[selectindex][1]=dlgload.m_point2d[dlgload.n2dpoint-1][1];
			dlgload.n2dpoint--;
		}
		dlgload.m_point3d[selectindex][0]=dlgload.m_point3d[dlgload.n3dpoint-1][0];
		dlgload.m_point3d[selectindex][1]=dlgload.m_point3d[dlgload.n3dpoint-1][1];
		dlgload.m_point3d[selectindex][2]=dlgload.m_point3d[dlgload.n3dpoint-1][2];
		dlgload.n3dpoint--;

		//对剩下的点进行三角化
		if(dlgload.n2dpoint!=0)
		{
			int kk=0;
			int &numberoftriangle=kk;		
			int vertexindex[100000];

			dlgload.triangulation(dlgload.m_point2d,dlgload.n2dpoint,vertexindex,numberoftriangle);
			dlgload.ntri=numberoftriangle;

			for(int i=0;i<dlgload.ntri;i++)
			{
				for(int j=0;j<3;j++)
					dlgload.triangle[i][j]=vertexindex[i*3+j];		
			}
		}

		Invalidate(FALSE);
	}
}

⌨️ 快捷键说明

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