生成球 使用openMesh 庫


簡介

使用openmesh生成一個球,采用的是標准球坐標系。


// 生成球  n 最好輸入偶數  10 或者 100 
#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;

int main()
{
	MyMesh mesh;
	int n,count=10000,k=-1;
	cout << "n:";
	cin >> n;
	MyMesh::VertexHandle *vhandle = new MyMesh::VertexHandle[count];
	std::vector<MyMesh::VertexHandle>face_vhandles;
	for (int j =0;j < n;j++) {
		double distance = cos(j*pi / n);// 原先是 sin
		double r_circle = sin(j*pi / n);
		for (int i = 0;i < n;i++) {
			++k;
			vhandle[k]=mesh.add_vertex(MyMesh::Point(r_circle*cos(2 * i*pi / n), r_circle*sin(2 * i*pi / n), distance));
			// 對網格添加頂點
		}
	}
	for (int i = 0;i < n-1;i++) {
		for (int j = 0;j < n;j++) {
			int topRight = i * n + j;
			int topLeft = i * n + (j + 1) % n;
			int bottomRight = (i + 1)*n + j;
			int bottomLeft = (i + 1)*n + (j + 1) % n;
			face_vhandles.clear();
			face_vhandles.push_back(vhandle[bottomRight]);
			face_vhandles.push_back(vhandle[bottomLeft]);
			face_vhandles.push_back(vhandle[topRight]);
			mesh.add_face(face_vhandles);

			face_vhandles.clear();
			face_vhandles.push_back(vhandle[bottomLeft]);
			face_vhandles.push_back(vhandle[topLeft]);
			face_vhandles.push_back(vhandle[topRight]);
			mesh.add_face(face_vhandles);

		}
	}
	//vhandle[k+1] = mesh.add_vertex(MyMesh::Point(0, 0, 1));
	vhandle[k+1] = mesh.add_vertex(MyMesh::Point(0, 0, -1));
	for (int i = 0;i < n;i++) {
		//face_vhandles.clear();
		//
		//
		//face_vhandles.push_back(vhandle[i]);
		//face_vhandles.push_back(vhandle[(i + 1) % n]);
		//face_vhandles.push_back(vhandle[k + 2]);
		//mesh.add_face(face_vhandles);

		face_vhandles.clear();
		
		
		face_vhandles.push_back(vhandle[k- i]);
		face_vhandles.push_back(vhandle[k - (i + 1) % n]);
		face_vhandles.push_back(vhandle[k + 1]);
		mesh.add_face(face_vhandles);
	}
	try
	{
		if (!OpenMesh::IO::write_mesh(mesh, "output5 .off")) {
			std::cerr << "Cannot write mesh to file ' output5 .off ' " << std::endl;
			return 1;
		}
	}
	catch (std::exception&x) {
		std::cerr << x.what() << std::endl;
		return 1;
	}
    return 0;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM