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

📄 tin3dview.cpp

📁 Tin3D.rar 三维TIN的构建方面的东西
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void CTin3DView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
    glViewport(0,0,cx,cy);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
	if(cx<=cy)
		glOrtho(-500.0,500.0,-500.0*(GLfloat)cy/(GLfloat)cx,
		500.0*(GLfloat)cy/(GLfloat)cx,-500.0,500.0);
    else
		glOrtho(-500.0*(GLfloat)cx/(GLfloat)cy,
		500.0*(GLfloat)cx/(GLfloat)cy,-500.0,500.0,-500.0,500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
	
	
}

void CTin3DView::OnPaint() 
{
	
	
	CPaintDC dc(this); 
	glColor3f(0,0.4,1);
	glClear(GL_COLOR_BUFFER_BIT);
	
	CalculateNormal();    //三角面法向量
	GLfloat light_position0[]={-108,0,180,0.0f};
	GLfloat light_specular0[]={1,1,1,1};
	GLfloat light_diffuse[]={1.0f,1.0f,1.0f,0.0f};
	glLightfv(GL_LIGHT0,GL_POSITION,light_position0);
	glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular0);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);
	this->OPenGL_Lighting();
	if (n)
	{glPushMatrix();
	
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);  
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);			
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_DECAL);    //在此处更改映射模式,选择GL_DECAL、GL_MODULATE、GL_BLEND分别察看演示效果
	glEnable(GL_TEXTURE_2D);
	glShadeModel(GL_FLAT);   //更改GL_SMOOTH、GL_FLAT进行试验,察看效果
	/*  设置纹理坐标和物体几何坐标 */
	glRotatef(m_Rotateangle, 1, 1, 1);
	//纹理坐标的定义与演示效果,该图位于左下,纹理与图形表面吻合
	for (int i=0; i<m_triangles.size(); i++)
	{
		glBegin(GL_TRIANGLES);
		glTexCoord2f(0.0, 0.0); 
		glVertex3f(m_triangles[i].ptr[0].x, m_triangles[i].ptr[0].y, m_triangles[i].ptr[0].z);
		glTexCoord2f(0.0, 1.0); 
		glVertex3f(m_triangles[i].ptr[1].x, m_triangles[i].ptr[1].y, m_triangles[i].ptr[1].z);
		glTexCoord2f(1.0, 1.0);
		glVertex3f(m_triangles[i].ptr[2].x, m_triangles[i].ptr[2].y, m_triangles[i].ptr[2].z);
		glEnd();
	}
	glFlush();
	glDisable(GL_TEXTURE_2D);
	glPopMatrix();
	}
	
	
	
	
	
	//		this->OPengl_Tuxture();
	
	
	
	
	
}



void CTin3DView::CalculateNormal()
{
    initial();
	GLdouble dVector1[3],dVector2[3],norm[3];
	for (int i=0; i<m_triangles.size(); i++)
	{
		dVector1[0] = m_triangles[i].ptr[1].x - m_triangles[i].ptr[0].x;
		dVector1[1] = m_triangles[i].ptr[1].y - m_triangles[i].ptr[0].y;
		dVector1[2] = m_triangles[i].ptr[1].z - m_triangles[i].ptr[0].z;
		
		dVector2[0] = m_triangles[i].ptr[2].x - m_triangles[i].ptr[0].x;
		dVector2[1] = m_triangles[i].ptr[2].y - m_triangles[i].ptr[0].y;
		dVector2[2] = m_triangles[i].ptr[2].z - m_triangles[i].ptr[0].z;
		
		norm[0]=dVector1[1]*dVector2[2]-dVector1[2]*dVector2[1];
		norm[1]=dVector1[2]*dVector2[0]-dVector1[0]*dVector2[2];
		norm[2]=dVector1[0]*dVector2[1]-dVector1[1]*dVector2[0];
		
		double dNormalLength=sqrt(norm[0]*norm[0] + norm[1]*norm[1] + norm[2]*norm[2]);
		
		if(dNormalLength!=0.0)
		{
			m_triangles[i].Normal[0]=norm[0]/dNormalLength;
			m_triangles[i].Normal[1]=norm[1]/dNormalLength;
			m_triangles[i].Normal[2]=norm[2]/dNormalLength;
		}
		else
		{
			m_triangles[i].Normal[0]=0;
			m_triangles[i].Normal[1]=0;
			m_triangles[i].Normal[2]=0;
		}
	}
	
}

void CTin3DView::OnOpenglLighting() 
{
	
	Invalidate(true);	
}

void CTin3DView::OPenGL_Lighting()
{
    glPushMatrix();
	GLfloat mat_diffuse[]={0.0f,1.0f,0.4f,1.0f};
    GLfloat mat_specular[]={0.0f,1.0f,0.4f,1.0f};
    GLfloat mat_shininess[]={80.0f};
	glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
	
	glClearColor(0.0,0.0,0.0,0.0);
    glShadeModel(GL_SMOOTH);
	
    glPolygonMode(GL_FRONT,GL_FILL);
	glColor3f(0.0f,0.4f,1.0f);
	
	for(int i=0;i<m_triangles.size();i++)
	{
		double dNormal[3];
		dNormal[0] = m_triangles[i].Normal[0];
		dNormal[1] = m_triangles[i].Normal[1];
		dNormal[2] = m_triangles[i].Normal[2];
		
		glBegin(GL_POLYGON);
		glNormal3dv(dNormal);
		glVertex3f(m_triangles[i].ptr[0].x, m_triangles[i].ptr[0].y, m_triangles[i].ptr[0].z);
		glVertex3f(m_triangles[i].ptr[1].x, m_triangles[i].ptr[1].y, m_triangles[i].ptr[1].z);
		glVertex3f(m_triangles[i].ptr[2].x, m_triangles[i].ptr[2].y, m_triangles[i].ptr[2].z);
		glEnd();
		glFlush();
	}
	
	glPopMatrix();
	
}










void CTin3DView::OnGetVertex() 
{
	IsOpen=1;
	// TODO: Add your command handler code here
	FILE  *mm_vertexFile;
	CFileDialog location(true);
	location.DoModal();
	mm_vertexFile=fopen(location.GetPathName(),"r");
	
	for (int i=0;i<MAX;i++) 
	{
		
		float a,b,c;
		a=b=c=0.0;
		m_vertex[i].x=0.0;
		fscanf(mm_vertexFile,"%f%f%f",&a ,&b,&c);
		(m_vertex[i].x)=(a-87450)*1.5;
		//		(m_vertex[i].x)=(a-87500)*1.5 ;
		(m_vertex[i].y)=(b-12700)*1.5;
		//		(m_vertex[i].y)=(b-12800);
		(m_vertex[i].z)=c*1.5;
		
	}
	fclose(mm_vertexFile);
	
}

void CTin3DView::BuildTIN()
{
	
	if (MAX > 2)
	{
		for(int i=0;i<MAX-1;i++)          //确定基线
		{
			//			glBegin(GL_LINE_LOOP);
			//		glVertex3f(m_vertex[i].x,m_vertex[i].y,m_vertex[i].z);
			//		glEnd();
			for(int j=i+1;j<MAX;j++)
			{
				if(m_vertex[i].x>m_vertex[j].x)
				{
					Vertex temp;
					temp.x=m_vertex[i].x;
					temp.y=m_vertex[i].y;
					temp.z=m_vertex[i].z;
					
					
					
					m_vertex[i].x=m_vertex[j].x;
					m_vertex[i].y=m_vertex[j].y;
					m_vertex[i].z=m_vertex[j].z;
					
					
					
					m_vertex[j].x=temp.x;
					m_vertex[j].y=temp.y;
					m_vertex[j].z=temp.z;
					
					
					
					
				}
			}
		}
		
		if(m_vertex[0].y>m_vertex[1].y)                //沿基线固定方向
			this->TriDelaunay(m_vertex[0],m_vertex[1]);//调用边扩展算法构网delaunay
		else
			this->TriDelaunay(m_vertex[1],m_vertex[0]);//调用边扩展算法构网delaunay
	}
	
	
	
	
}

//DEL void CALLBACK CTin3DView::Rotate(GLvoid)
//DEL {
//DEL 			glRotatef(30,1,0,0);;
//DEL 
//DEL }




void CTin3DView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	IsOpen++;
	// 	glClear(GL_COLOR_BUFFER_BIT);
	int n=IsOpen%6;
	switch(n)
	{
	case 0:
		{ 
			glLoadIdentity();
			glRotatef(30,1,0,0);
			break;
		}
	case 1:
		{
			glLoadIdentity();
			glRotatef(30,1,0,0);
			break;
		}
		
		
	case 2:
		{
			glLoadIdentity();
			glRotatef(45,0,0,1);
			break;
		}
	case 3:
		glLoadIdentity();
		glRotatef(-45,0,0,1);
	}
	
	CView::OnLButtonDown(nFlags, point);
}

void CTin3DView::OnTx() 
{
	n=1;
	// TODO: Add your command handler code here
	
	CChooseTexture d2;
	d2.DoModal();
	CFileDialog mOpen(true);
	if (mOpen.DoModal()==IDOK)
	{
		AUX_RGBImageRec *Image=auxDIBImageLoad(mOpen.GetPathName());
		glTexImage2D(GL_TEXTURE_2D, 0, 3, Image->sizeX,Image->sizeY, 
			0, GL_RGB, GL_UNSIGNED_BYTE,Image->data);
		
	}
}

void CTin3DView::OnPoint() 
{
	// TODO: Add your command handler code here
	Invalidate(true);
	CDiaBegin d1;
	CChooseTexture d2;
	BeginWaitCursor();
	if (d1.DoModal()==1)
	{
		
		FILE  *mm_vertexFile;
		CFileDialog location(true);
		location.DoModal();
		mm_vertexFile=fopen(location.GetPathName(),"r");
		
		for (int i=0;i<MAX;i++) 
		{
			
			float a,b,c;
			a=b=c=0.0;
			m_vertex[i].x=0.0;
			fscanf(mm_vertexFile,"%f%f%f",&a ,&b,&c);
			(m_vertex[i].x)=(a-87450)*1.5;
			//		(m_vertex[i].x)=(a-87500)*1.5 ;
			(m_vertex[i].y)=(b-12700)*1.5;
			//		(m_vertex[i].y)=(b-12800);
			(m_vertex[i].z)=c*1.5;
			
		}
		fclose(mm_vertexFile);
		glClear(GL_COLOR_BUFFER_BIT);
		glClearColor(0.0,0.0,0.0,1.0);
		//	glTranslatef(0,0,-2);
		glShadeModel(GL_SMOOTH );
		glTranslatef( 0, 0,-500);
		glPointSize(2);	
		glColor4f(0,0.4,1,1);
		BuildTIN();	
		
		
		
	}
	EndWaitCursor();
}

⌨️ 快捷键说明

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