简介

生成一个多边形网格的函数。

三角形面片判断法线方向

顺时针,表示平面方向向下??
逆时针,表示平面方向向上??

代码

// AddPolygon.cpp: 定义控制台应用程序的入口点。
//

//#include "stdafx.h"
#include <iostream>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
#include <cmath>
#define pi 3.1415926
using namespace std;
typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;


MyMesh::VertexHandle* AddPolygon(MyMesh& mesh, int edge, double z, bool topOrBottom) {
	std::cout << edge << " " << z << " " << topOrBottom << std::endl;
	MyMesh::VertexHandle *vhandle = new MyMesh::VertexHandle[edge + 1];// 不知道为什么要多一个点,  对可能的原心
	for (int i = 0; i < edge; i++) {
		double x = 0.5*cos(pi * 2 / edge * i);
		double y = 0.5*sin(pi * 2 / edge * i);
		vhandle[i] = mesh.add_vertex(MyMesh::Point(x, y, z));
	}
	std::vector<MyMesh::VertexHandle>face_vhandles;
	int o = 0;
	switch (edge) {
	case 3:
		if (topOrBottom) {
			face_vhandles.clear();
			face_vhandles.push_back(vhandle[0]);
			face_vhandles.push_back(vhandle[1]);
			face_vhandles.push_back(vhandle[2]);
			mesh.add_face(face_vhandles);
		}
		else {
			face_vhandles.clear();
			face_vhandles.push_back(vhandle[0]);
			face_vhandles.push_back(vhandle[2]);
			face_vhandles.push_back(vhandle[1]);
			mesh.add_face(face_vhandles);
		}
		break;
	case 4:
		o = topOrBottom ? 3 : 1;
		face_vhandles.clear();
		face_vhandles.push_back(vhandle[0]);
		face_vhandles.push_back(vhandle[2]);
		face_vhandles.push_back(vhandle[o]);
		mesh.add_face(face_vhandles);
		face_vhandles.clear();
		face_vhandles.push_back(vhandle[2]);
		face_vhandles.push_back(vhandle[0]);
		face_vhandles.push_back(vhandle[(o+2)%4]);
		mesh.add_face(face_vhandles);
		break;
	default:
		vhandle[edge] = mesh.add_vertex(MyMesh::Point(0, 0, z));//加入圆心
		for (int i = 0; i < edge; i++) {//这里应该没什么问题
			o = topOrBottom ? (i+1)%edge : (i+edge-1)%edge; // 当为 top 时  逆时针 法线方向向上
			                                                // 当为 Bottom 时 顺时针 ,法线方向朝下??
			
			face_vhandles.clear();
			face_vhandles.push_back(vhandle[edge]);
			face_vhandles.push_back(vhandle[i]);
			face_vhandles.push_back(vhandle[o]);
			mesh.add_face(face_vhandles);
		break;
	}
	return vhandle;
}

int main()
{
	MyMesh mesh;
	
	int edge;
	double z;
	bool topOrBottom;

	cout << "edge(int) z(double) topOrBottom(bool)" << std::endl;
	cin >> edge >> z >> topOrBottom;

	AddPolygon(mesh, edge, z, topOrBottom);
	try
	{
		if (!OpenMesh::IO::write_mesh(mesh, "output2 .off")) {
			std::cerr << "Cannot write mesh to file ' output2 .off ' " << std::endl;
			return 1;
		}
	}
	catch (std::exception&x) {
		std::cerr << x.what() << std::endl;
		return 1;
	}
    return 0;
}


posted on 2019-07-05 14:42  HDU李少帅  阅读(472)  评论(0编辑  收藏  举报