简介
生成一个多边形网格的函数。
三角形面片判断法线方向
顺时针,表示平面方向向下??
逆时针,表示平面方向向上??
代码
// 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;
}