#include<iostream>
#include<fstream>
#include "GL/glut.h"
#include <math.h>
#include<string>
#include<queue>
using namespace std;
int numOfVertex = 0;
int numOfFace = 0;
int numOfLine = 0;
int WIDTH = 600;
int HEIGHT = 600;
float maxx = -1;
float maxy = -1;
float maxz = -1;
float minx = 1;
float miny = 1;
float minz = 1;
GLfloat ShootPosition[] = { 0,0,0 };
GLfloat ShootDirect[] = { 0,0,0 };
float scale = 1.0;
float px;
float py;
float theta1 = 0;
float theta2 = 0;
float radius = 0;
bool light1 = false;
bool light2 = false;
bool light3 = false;
int displaystate = 0;
float PI = 3.1415926;
struct vertex;
struct face;
struct halfedge;
struct he_face;
struct normalVec;
struct nedge;
vertex* vertexs;
face* faces;
he_face** hefaces;
normalVec* normalvectors;
nedge** iedges;
struct halfedge {//半边结构
halfedge* next;
halfedge* opposite;
int end;
bool visit;
he_face* face;
halfedge() {
next = NULL;
opposite = NULL;
end = -1;
face = NULL;
visit = false;
}
};
struct vertex {//顶点
float x;
float y;
float z;
halfedge* edge;
bool visit;
vertex() {
visit = false;
}
vertex(float a, float b, float c) {
x = a;
y = b;
z = c;
edge = NULL;
visit = false;
}
};
struct normalVec {//法向量
float x;
float y;
float z;
normalVec() {
}
normalVec(float a, float b, float c) {
x = a;
y = b;
z = c;
}
};
struct he_face {//半边面
halfedge* edge;
bool visit;
he_face() {
edge = NULL;
visit = false;
}
};
struct face {//面
int numofv;
int* vertexs;
face() {
}
face(int nv) {
numofv = nv;
vertexs = new int[nv];
}
};
struct nedge {
int start;
int middle;
halfedge* he;
nedge* next;
nedge() {
start = -1;
he = NULL;
next = NULL;
middle = -1;
}
};
void readFile() {//读取文件
char data[100];
ifstream infile;
//cout << "输入要读取的文件名 :" << endl;
string filename="m0.off";
//cin >> filename;
infile.open("off/" + filename);
infile >> data;
infile >> numOfVertex;
infile >> numOfFace;
infile >> numOfLine;
vertexs = new vertex[numOfVertex];
faces = new face[numOfFace];
int vnum = 0;
int fnum = 0;
while (vnum < numOfVertex) {//读顶点信息
float x;
float y;
float z;
infile >> x;
infile >> y;
infile >> z;
vertexs[vnum] = vertex(x, y, z);
vnum++;
}
while (fnum<numOfFace)//读面信息
{
int numofv;
infile >> numofv;
face f = face(numofv);
for (int i = 0; i < numofv; i++)
{
int v;
infile >> v;
f.vertexs[i] = v;
}
faces[fnum] = f;
fnum++;
}
infile.close();
}
int getMiddle(int start, int end, nedge** iedges) {
nedge* temp = iedges[start];
while (temp != NULL) {
if (temp->he->end == end) {
break;
}
temp = temp->next;
}
if (temp == NULL) {
return -1;
}
else {
return temp->middle;
}
}
halfedge* getHalfEdge(int start, int end, nedge** iedges) {
nedge* temp = iedges[start];
while (temp != NULL) {
if (temp->he->end == end) {
break;
}
temp = temp->next;
}
if (temp == NULL) {
return NULL;
}
else {
return temp->he;
}
}
void initHalfedge() {//初始化半边结构
hefaces = new he_face*[numOfFace];
int numofhe = 0;
for (int i = 0; i < numOfVertex; i++)
{
iedges[i] = NULL;
}
for (int i = 0; i < numOfFace; i++)
{
int v1 = faces[i].vertexs[0];
int v2 = faces[i].vertexs[1];
int v3 = faces[i].vertexs[2];
he_face* hf = new he_face();
halfedge* he1 = getHalfEdge(v1, v2, iedges);
halfedge* he2 = getHalfEdge(v2, v3, iedges);
halfedge* he3 = getHalfEdge(v3, v1, iedges);
if (he1 == NULL) {
he1 = new halfedge();
he1->end = v2;
halfedge* opposite1 = new halfedge();
opposite1->end = v1;
opposite1->opposite = he1;
he1->opposite = opposite1;
nedge* temp = iedges[v1];
nedge* tempi = new nedge();
tempi->start = v1;
tempi->he = he1;
if (temp == NULL) {
iedges[v1] = tempi;
}
else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempi;
}
temp = iedges[v2];
tempi = new nedge();
tempi->start = v2;
tempi->he = opposite1;
if (temp == NULL) {
iedges[v2] = tempi;
}
else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempi;
}
}
if (he2 == NULL) {
he2 = new halfedge();
he2->end = v3;
halfedge* opposite2 = new halfedge();
opposite2->end = v2;
opposite2->opposite = he2;
he2->opposite = opposite2;
nedge* temp = iedges[v2];
nedge* tempi = new nedge();
tempi->start = v2;
tempi->he = he2;
if (temp == NULL) {
iedges[v2] = tempi;
}
else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempi;
}
temp = iedges[v3];
tempi = new nedge();
tempi->start = v3;
tempi->he = opposite2;
if (temp == NULL) {
iedges[v3] = tempi;
}
else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempi;
}
}
if (he3 == NULL) {
he3 = new halfedge();
he3->end = v1;
halfedge* opposite3 = new halfedge();
opposite3->end = v3;
opposite3->opposite = he3;
he3->opposite = opposite3;
nedge* temp = iedges[v3];
nedge* tempi = new nedge();
tempi->start = v3;
tempi->he = he3;
if (temp == NULL) {
iedges[v3] = tempi;
}
else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempi;
}
temp = iedges[v1];
tempi = new nedge();
tempi->start = v1;
tempi->he = opposite3;
if (temp == NULL) {
iedges[v1] = tempi;
}
else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = tempi;
}
}
he1->next = he2;
he2->next = he3;
he3->next = he1;
hf->edge = he1;
he1->face = hf;
he2->face = hf;
he3->face = hf;
if (vertexs[v1].edge == NULL)
vertexs[v1].edge = he1;
if (vertexs[v2].edge == NULL)
vertexs[v2].edge = he2;
if (vertexs[v3].edge == NULL)
vertexs[v3].edge = he3;
hefaces[i] = hf;
}
}
void drawModel() {//画出模型
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
for (int i = 0; i < numOfFace; i++)
{
halfedge* e = hefaces[i]->edge;
vertex v1 = vertexs[e->end];
vertex v2 = vertexs[e->next->end];
vertex v3 = vertexs[e->next->next->end];
glBegin(GL_POLYGON);
glNormal3f(normalvectors[i].x, normalvectors[i].y, normalvectors[i].z);
glVertex3f(v1.x, v1.y, v1.z);
glVertex3f(v2.x, v2.y, v2.z);
glVertex3f(v3.x, v3.y, v3.z);
glEnd();
}
glutSwapBuffers();
glFlush();
}
void insertIedge(nedge** iedges, nedge* ie) {
nedge* it = iedges[ie->start];
if (it == NULL) {
iedges[ie->start] = ie;
}
else {
while (it->next != NULL)
{
it = it->next;
}
it->next = ie;
}
}
void computeNormalVec() {
normalvectors = new normalVec[numOfFace];
for (int i = 0; i < numOfFace; i++)
{
halfedge* hef = hefaces[i]->edge;
int v0 = hef->next->next->end;
int v1 = hef->end;
int v2 = hef->next->end;
float p1[] = { vertexs[v1].x - vertexs[v0].x, vertexs[v1].y - vertexs[v0].y,vertexs[v1].z - vertexs[v0].z };
float p2[] = { vertexs[v2].x - vertexs[v1].x,vertexs[v2].y - vertexs[v1].y,vertexs[v2].z - vertexs[v1].z };
float nx = p1[1] * p2[2] - p1[2] * p2[1];
float ny = p1[2] * p2[0] - p1[0] * p2[2];
float nz = p1[0] * p2[1] - p1[1] * p2[0];
float len = sqrt(pow(nx, 2) + pow(ny, 2) + pow(nz, 2));
nx = nx / len;
ny = ny / len;
nz = nz / len;
normalvectors[i] = normalVec(nx, ny, nz);
}
}
void loopDivision() {//loop细分算法
vertex* newvertexs = new vertex[numOfVertex + 1.5*numOfFace]; //新添加顶点数组
he_face** nfaces = new he_face*[4 * numOfFace]; //新添加面数组
nedge** niedges = new nedge*[num
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
EX3.zip (81个子文件)
EX3
.vs
EX3
v14
.suo 30KB
EX3.sln 1KB
Release
EX3.exe 38KB
EX3.iobj 340KB
EX3.pdb 908KB
EX3.ipdb 157KB
EX3
Release
EX3.log 136B
vc140.pdb 444KB
EX3.obj 1.15MB
EX3.tlog
CL.write.1.tlog 652B
CL.read.1.tlog 19KB
CL.command.1.tlog 618B
link.write.1.tlog 456B
EX3.lastbuildstate 195B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
obj
perfect.obj 1KB
1_store.bmp 768KB
EX3.vcxproj 7KB
EX3.cpp 21KB
off
block.off 123KB
triceratops.off 83KB
m1.off 169KB
helix2.off 24KB
cube.off 135B
bunny.off 376KB
cuboctahedron.off 583B
sphere2.off 14KB
dragon.off 7.09MB
fandisk.off 555KB
max.off 53KB
horse.off 3.22MB
m1.off.bak 169KB
tetrahedron.off 151B
buddha.off 4.17MB
m0.off.bak 14KB
Arma.off 1.44MB
cone.off 1KB
snub_cube.off 979B
snub_dodecahedron.off 3KB
bigbunny.off 2.42MB
boxcube.off 1KB
m0.off 14KB
icosahedron.off 564B
m6.off 550KB
dodecahedron.off 821B
dinosaur.off 116KB
octtorus.off 864B
rocker.off 590KB
tet3d.off 707B
triangle.off 44B
boxtorus.off 678B
octahedron.off 228B
EX3.vcxproj.filters 1KB
Debug
EX3.log 4KB
vc140.pdb 524KB
vc140.idb 1.07MB
Expermient4.obj 643KB
EX3.obj 454KB
EX3.tlog
link.14540-cvtres.write.1.tlog 2B
link.14540-cvtres.read.1.tlog 2B
CL.write.1.tlog 2KB
CL.read.1.tlog 53KB
link.14540-rc.write.1.tlog 2B
unsuccessfulbuild 0B
CL.command.1.tlog 1KB
link.14540.read.1.tlog 2B
link-cvtres.read.1.tlog 2B
link.write.1.tlog 2B
EX3.lastbuildstate 224B
link-rc.write.1.tlog 2B
link-cvtres.write.1.tlog 2B
link.command.1.tlog 1KB
link-rc.read.1.tlog 2B
link.read.1.tlog 2B
link.14540-rc.read.1.tlog 2B
link.14540.write.1.tlog 2B
EX3.VC.db 36.67MB
glut.h 660B
Debug
freeglut.dll 194KB
EX3.pdb 1.65MB
共 81 条
- 1
资源评论
第-五
- 粉丝: 7
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mmqrcode1714153659780.png
- Screenshot_2024-04-27-06-08-58-486_com.baidu.xin.aiqicha.jpg
- 基于Javaweb+Tomcat+MySQL的大学生公寓管理系统+sql文件.zip
- 实训作业基于javaweb的订单管理系统源码+数据库+实训报告.zip
- 多机调度问题贪心算法基于最小堆和贪心算法求解多机调度问题.zip
- 基于同态加密技术的匿名电子投票系统源码.zip
- Pyqt5项目框架-PyQt项目开发实践
- 基于C通过MQTT的智能农业大棚管理系统(本科毕业设计)
- python+CNN的网络入侵检测算法源码.zip
- js 实现记住密码功能 js.cookie.min.js
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功