📄 tin3dview.cpp
字号:
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 + -