/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * * Copyright(C) 2004 \/)\/ * * Visual Computing Lab /\/| * * ISTI - Italian National Research Council | * * \ * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * for more details. * * * ****************************************************************************/ /**************************************************************************** History $Log: not supported by cvs2svn $ Revision 1.4 2004/03/11 18:14:19 tarini prova Revision 1.2 2004/03/03 16:11:46 cignoni First working version (tetrahedron!) ****************************************************************************/ #ifndef __VCGLIB_PLATONIC #define __VCGLIB_PLATONIC //#include #include namespace vcg { namespace tri { template void Tetrahedron(TetraMeshType &in) { in.Clear(); Allocator::AddVertices(in,4); Allocator::AddFaces(in,4); TetraMeshType::VertexPointer ivp[4]; TetraMeshType::VertexIterator vi=in.vert.begin(); ivp[0]=&*vi;(*vi).P()=TetraMeshType::CoordType ( 1, 1, 1); ++vi; ivp[1]=&*vi;(*vi).P()=TetraMeshType::CoordType (-1, 1,-1); ++vi; ivp[2]=&*vi;(*vi).P()=TetraMeshType::CoordType (-1,-1, 1); ++vi; ivp[3]=&*vi;(*vi).P()=TetraMeshType::CoordType ( 1,-1,-1); TetraMeshType::FaceIterator fi=in.face.begin(); (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[1]; (*fi).V(2)=ivp[2]; ++fi; (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[2]; (*fi).V(2)=ivp[3]; ++fi; (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[3]; (*fi).V(2)=ivp[1]; ++fi; (*fi).V(0)=ivp[3]; (*fi).V(1)=ivp[2]; (*fi).V(2)=ivp[1]; } template void Octahedron(OctMeshType &in) { in.Clear(); Allocator::AddVertices(in,6); Allocator::AddFaces(in,8); OctMeshType::VertexPointer ivp[6]; OctMeshType::VertexIterator vi=in.vert.begin(); ivp[0]=&*vi;(*vi).P()=OctMeshType::CoordType ( 1, 0, 0); ++vi; ivp[1]=&*vi;(*vi).P()=OctMeshType::CoordType ( 0, 1, 0); ++vi; ivp[2]=&*vi;(*vi).P()=OctMeshType::CoordType ( 0, 0, 1); ++vi; ivp[3]=&*vi;(*vi).P()=OctMeshType::CoordType (-1, 0, 0); ++vi; ivp[4]=&*vi;(*vi).P()=OctMeshType::CoordType ( 0,-1, 0); ++vi; ivp[5]=&*vi;(*vi).P()=OctMeshType::CoordType ( 0, 0,-1); OctMeshType::FaceIterator fi=in.face.begin(); (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[1]; (*fi).V(2)=ivp[2]; ++fi; (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[2]; (*fi).V(2)=ivp[4]; ++fi; (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[4]; (*fi).V(2)=ivp[5]; ++fi; (*fi).V(0)=ivp[0]; (*fi).V(1)=ivp[5]; (*fi).V(2)=ivp[1]; ++fi; (*fi).V(0)=ivp[3]; (*fi).V(1)=ivp[1]; (*fi).V(2)=ivp[5]; ++fi; (*fi).V(0)=ivp[3]; (*fi).V(1)=ivp[5]; (*fi).V(2)=ivp[4]; ++fi; (*fi).V(0)=ivp[3]; (*fi).V(1)=ivp[4]; (*fi).V(2)=ivp[2]; ++fi; (*fi).V(0)=ivp[3]; (*fi).V(1)=ivp[2]; (*fi).V(2)=ivp[1]; } template void Icosahedron(IcoMeshType &in) { IcoMeshType::ScalarType L=IcoMeshType::ScalarType((math::Sqrt(5.0)+1.0)/2.0); IcoMeshType::CoordType vv[12]={ IcoMeshType::CoordType ( 0, L, 1), IcoMeshType::CoordType ( 0, L,-1), IcoMeshType::CoordType ( 0,-L, 1), IcoMeshType::CoordType ( 0,-L,-1), IcoMeshType::CoordType ( L, 1, 0), IcoMeshType::CoordType ( L,-1, 0), IcoMeshType::CoordType (-L, 1, 0), IcoMeshType::CoordType (-L,-1, 0), IcoMeshType::CoordType ( 1, 0, L), IcoMeshType::CoordType (-1, 0, L), IcoMeshType::CoordType ( 1, 0,-L), IcoMeshType::CoordType (-1, 0,-L) }; int ff[20][3]={ {1,0,4},{0,1,6},{2,3,5},{3,2,7}, {4,5,10},{5,4,8},{6,7,9},{7,6,11}, {8,9,2},{9,8,0},{10,11,1},{11,10,3}, {0,8,4},{0,6,9},{1,4,10},{1,11,6}, {2,5,8},{2,9,7},{3,10,5},{3,7,11} }; in.Clear(); Allocator::AddVertices(in,12); Allocator::AddFaces(in,20); IcoMeshType::VertexPointer ivp[12]; IcoMeshType::VertexIterator vi; int i; for(i=0,vi=in.vert.begin();vi!=in.vert.end();++i,++vi){ (*vi).P()=vv[i]; ivp[i]=&*vi; } IcoMeshType::FaceIterator fi; for(i=0,fi=in.face.begin();fi!=in.face.end();++i,++fi){ (*fi).V(0)=ivp[ff[i][0]]; (*fi).V(1)=ivp[ff[i][1]]; (*fi).V(2)=ivp[ff[i][2]]; } } template void Hexahedron(MESH_TYPE &in) { in.vn=8; in.fn=12; in.vert.clear(); in.face.clear(); MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; MESH_TYPE::CoordType tp; tp=MESH_TYPE::CoordType (-1,-1,-1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 1,-1,-1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (-1, 1,-1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 1, 1,-1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (-1,-1, 1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 1,-1, 1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (-1, 1, 1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 1, 1, 1); tv.P()=tp; in.vert.push_back(tv); vector index(in.vn); MESH_TYPE::face_type f;f.Supervisor_Flags()=0; MESH_TYPE::vertex_iterator vi; int j; for(j=0,vi=in.vert.begin();j void HalfOctahedron(MESH_TYPE &in) { in.vn=5; in.fn=4; in.vert.clear(); in.face.clear(); MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; MESH_TYPE::CoordType tp; tp=MESH_TYPE::CoordType ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 0, 0, 1); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); vector index(in.vn); MESH_TYPE::face_type f;f.Supervisor_Flags()=0; MESH_TYPE::vertex_iterator vi; int j; for(j=0,vi=in.vert.begin();j void Square(MESH_TYPE &in) { in.vn=4; in.fn=2; in.vert.clear(); in.face.clear(); MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; MESH_TYPE::CoordType tp; tp=MESH_TYPE::CoordType ( 1, 0, 0); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 0, 1, 0); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (-1, 0, 0); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 0,-1, 0); tv.P()=tp; in.vert.push_back(tv); vector index(in.vn); MESH_TYPE::face_type f;f.Supervisor_Flags()=0; MESH_TYPE::vertex_iterator vi; int j; for(j=0,vi=in.vert.begin();j void Sphere(MESH_TYPE &in, const int subdiv = 3 ) { Icosahedron(in); in.ComputeBorderFlag(); int lastsize = 0; for(int i=0;i >(in,MidPoint(),0); MESH_TYPE::vertex_iterator vi; for(vi = in.vert.begin()+lastsize;vi!=in.vert.end();++vi) vi->P().Normalize(); lastsize = in.vert.size(); } } /// r1 = raggio 1, r2 = raggio2, h = altezza (asse y) template void Cone( MESH_TYPE & in, const typename MESH_TYPE::ScalarType r1, const typename MESH_TYPE::ScalarType r2, const typename MESH_TYPE::ScalarType h ) { const int D = 24; int i,b1,b2; if(r1==0 || r2==0) { in.vn=D+2; in.fn=D*2; } else { in.vn=D*2+2; in.fn=D*4; } in.vert.clear(); in.face.clear(); MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; MESH_TYPE::CoordType tp; tp=MESH_TYPE::CoordType ( 0,-h/2,0 ); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType ( 0, h/2,0 ); tv.P()=tp; in.vert.push_back(tv); b1 = b2 = 2; if(r1!=0) { for(i=0;i index(in.vn); MESH_TYPE::face_type f; f.Supervisor_Flags()=0; MESH_TYPE::vertex_iterator vi; int j; for(j=0,vi=in.vert.begin();j void Box(MESH_TYPE &in, const typename MESH_TYPE::BoxType & bb ) { in.vn=8; in.fn=12; in.vert.clear(); in.face.clear(); MESH_TYPE::VertexType tv;tv.Supervisor_Flags()=0; MESH_TYPE::CoordType tp; tp=MESH_TYPE::CoordType (bb.min[0],bb.min[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.max[0],bb.min[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.min[0],bb.max[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.max[0],bb.max[1],bb.min[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.min[0],bb.min[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.max[0],bb.min[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.min[0],bb.max[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); tp=MESH_TYPE::CoordType (bb.max[0],bb.max[1],bb.max[2]); tv.P()=tp; in.vert.push_back(tv); vector index(in.vn); MESH_TYPE::face_type f;f.Supervisor_Flags()=0; MESH_TYPE::vertex_iterator vi; int j; for(j=0,vi=in.vert.begin();j void Build( M & in, const V & v, const F & f) { in.vn = v.size(); in.fn = f.size(); in.vert.clear(); in.face.clear(); V::const_iterator vi; M::VertexType tv; tv.Supervisor_Flags()=0; for(vi=v.begin();vi!=v.end();++vi) { tv.P() = M::CoordType( (M::ScalarType)(*vi).Ext(0), (M::ScalarType)(*vi).Ext(1), (M::ScalarType)(*vi).Ext(2) ); in.vert.push_back(tv); } vector index(in.vn); M::vertex_iterator j; int k; for(k=0,j=in.vert.begin();j!=in.vert.end();++j,++k) index[k] = &*j; F::const_iterator fi; M::face_type ft; ft.Supervisor_Flags()=0; for(fi=f.begin();fi!=f.end();++fi) { assert( (*fi)[0]>=0 ); assert( (*fi)[1]>=0 ); assert( (*fi)[2]>=0 ); assert( (*fi)[0]