利用外法线法,绘制任意一个消隐凸多面体,要求:
(1)视点由用户输入;
(2)消隐部分用虚线绘制。
#include <iostream>
#include <cmath>
#include<windows.h>
#include<stdlib.h>
#include<gl/glut.h>
#include<stdio.h>
#include<math.h> //X86
#include<glaux.h>
using namespace std;
void Init()
{
glClearColor(0.0f, 0.0f, 0.1f, 0);//清除颜色函数。会清除(即绘制)的背景色。
//glCullFace(GL_BACK);//背面不可见
//glEnable(GL_CULL_FACE);//裁剪
//glEnable(GL_TEXTURE_2D);//开启纹理
}void Reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
//glMatrixMode设置接下来的矩阵操作为投影矩阵或模型视图矩阵
//GL_PROJECTION参数用于设置接下来的操作为投影矩阵,GL_MODELVIEW参数则用于设置接下来的操作为模型视图矩阵。
//投影矩阵定义了从视点到裁剪平面的映射,决定了哪些物体可以被渲染以及它们在窗口中的位置。
// 模型视图矩阵则定义了物体在空间中的位置、旋转和缩放。
glLoadIdentity();
glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);//设置一个二维的正交投影矩阵。void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void XYZ() {
//gluLookAt(1, 1, 1, 0,0,0, 0, 1, 0);
glLineWidth(1);
//glColor3f(0.0, 0.0, 0.0);//坐标轴
glColor3f(0.1, 0.1, 0.1);
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex3i(-1000, 0,0);
glVertex3i(1000, 0,0);
glColor3f(0.0, 1.0, 0.0);
glVertex3i(0, -1000,0);
glVertex3i(0, 1000,0);
glColor3f(0.0, 0.0, 1.0);
glVertex3i(0,0, -1000);
glVertex3i(0,0, 1000);
glEnd();
glFlush();
}
void mydisplay() {
int x[10] = { 50,50,25,0,0,50,50,25,0,0 };
int y[10] = { 0,40,60,40,0,0,40,60,40,0 };
int z[10] = { 140,140,140,140,140,0,0,0,0,0 };
int f[7] = { 0,1,2,3,4,5,6 };
int p[7] = { 6,5,6,5,5,5,5 };
int fp[7][6] = { {0,1,2,3,4,0},{0,5,6,1,0},{5,9,8,7,6,5},{9,4,3,8,9},
{1,6,7,2,1 },{3,2,7,8,3},{0,4,9,5,0}
};
int SN;
int p1, p2, p3, u1, u2, u3, v1, v2, v3;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
cout << "请输入视角:" << endl;
int vi1, vi2, vi3;
cin>> vi1 >> vi2 >> vi3;
gluLookAt(vi1, vi2, vi3, 0, 0, 0, 0, 1, 0);
XYZ();
glLineWidth(3);
glColor3f(1.0, 1.0, 1.0);
for (int i = 0; i < 7; i++) {
p1 = fp[i][0];
p2 = fp[i][1];
p3 = fp[i][2];
u1 = x[p2] - x[p1];
u2 = y[p2] - y[p1];
u3 = z[p2] - z[p1];
v1 = x[p3] - x[p2];
v2 = y[p3] - y[p2];
v3 = z[p3] - z[p2];
SN = vi1*(u2 * v3 - u3 * v2) + vi2*(u3 * v1 - u1 * v3) + vi3*(u1 * v2 - u2 * v1);//能不能看见
if (SN <= 0) f[i] = -1;
}
for (int i = 0; i < 7; i++){
if (f[i] == -1) {
if (f[i] == -1) {
glLineStipple(2, 0xf0f0);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINE_STRIP);
for (int j = 0; j < p[i]; j++) {
int k = fp[i][j];
glVertex3i(x[k], y[k], z[k]);
}
Sleep(100);
glEnd();
glFlush();
glDisable(GL_LINE_STIPPLE);
}
//continue;
}//看不见的
else {
glBegin(GL_LINE_STRIP);
for (int j = 0; j < p[i]; j++) {
int k = fp[i][j];
glVertex3i(x[k], y[k], z[k]);
}
Sleep(100);
glEnd();
glFlush();
}
}
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 800);
glutCreateWindow("the forth plus menu");
/*int menuld = glutCreateMenu(menu);
glutAddMenuEntry("Hermiteth", 1);
glutAddMenuEntry("Bezierth", 2);
glutAddMenuEntry("Bspline", 3);
glutAddMenuEntry("Bezierogee", 4);
glutAddMenuEntry("improve", 5);
glutAddMenuEntry("End", 6);
glutAttachMenu(GLUT_RIGHT_BUTTON);*/
Init();
glutReshapeFunc(Reshape);
glutDisplayFunc(mydisplay);
glutMainLoop();
return 0;
}