1 /** @file gsFace.h 2 3 @brief Provides gsFace class for a face of a gsMesh. 4 5 This file is part of the G+Smo library. 6 7 This Source Code Form is subject to the terms of the Mozilla Public 8 License, v. 2.0. If a copy of the MPL was not distributed with this 9 file, You can obtain one at http://mozilla.org/MPL/2.0/. 10 11 Author(s): A. Mantzaflaris, D. Mayer 12 */ 13 14 #pragma once 15 16 #include <gsUtils/gsMesh/gsMeshElement.h> 17 #include <gsCore/gsLinearAlgebra.h> 18 19 20 namespace gismo 21 { 22 23 template <class T> 24 class gsFace : public gsMeshElement<T> 25 { 26 public: 27 /// Shared pointer for gsFace 28 typedef memory::shared_ptr< gsFace > Ptr; 29 30 /// Unique pointer for gsFace 31 typedef memory::unique_ptr< gsFace > uPtr; 32 33 typedef gsMeshElement<T> MeshElement; 34 typedef typename MeshElement::scalar_t scalar_t; 35 typedef typename MeshElement::gsVertexHandle gsVertexHandle; 36 typedef typename MeshElement::gsEdgeHandle gsEdgeHandle; 37 typedef typename MeshElement::gsFaceHandle gsFaceHandle; 38 39 public: gsFace()40 gsFace() : MeshElement() { } 41 ~gsFace()42 virtual ~gsFace() { } 43 gsFace(std::vector<gsVertexHandle> const & vert)44 gsFace(std::vector<gsVertexHandle> const & vert ) : MeshElement() 45 { 46 vertices = vert; 47 for ( typename std::vector<gsVertexHandle>::iterator 48 it = vertices.begin(); it!= vertices.end(); ++it) 49 (*it)->addFace(this); 50 } 51 handle()52 gsFaceHandle handle() { return static_cast<gsFaceHandle>(this); } 53 gsFace(gsVertexHandle const & v0,gsVertexHandle const & v1,gsVertexHandle const & v2)54 gsFace(gsVertexHandle const & v0, gsVertexHandle const & v1, gsVertexHandle const & v2) : MeshElement() 55 { 56 vertices.push_back(v0); 57 vertices.push_back(v1); 58 vertices.push_back(v2); 59 v0->addFace(this); 60 v1->addFace(this); 61 v2->addFace(this); 62 } 63 gsFace(gsVertexHandle const & v0,gsVertexHandle const & v1,gsVertexHandle const & v2,gsVertexHandle const & v3)64 gsFace(gsVertexHandle const & v0, gsVertexHandle const & v1, gsVertexHandle const & v2, gsVertexHandle const & v3) : MeshElement() 65 { 66 vertices.push_back(v0); 67 vertices.push_back(v1); 68 vertices.push_back(v2); 69 vertices.push_back(v3); 70 v0->addFace( handle() ); 71 v1->addFace(this); 72 v2->addFace(this); 73 v3->addFace(this); 74 } 75 76 // clone function 77 //GISMO_CLONE_FUNCTION(gsFace) clone()78 uPtr clone() const { return uPtr(new gsFace(*this)); } 79 80 bool operator< (gsFace const & rhs) const 81 { 82 return ( Xless<T>(this->vertices[0],rhs.vertices[0])|| 83 ( (this->vertices[0]->x() == rhs.vertices[0]->x() && 84 this->vertices[0]->y() == rhs.vertices[0]->y() && 85 this->vertices[0]->z() == rhs.vertices[0]->z() ) && 86 Xless<T>(this->vertices[1],rhs.vertices[1]) )|| 87 ( (this->vertices[0]->x() == rhs.vertices[0]->x() && 88 this->vertices[0]->y() == rhs.vertices[0]->y() && 89 this->vertices[0]->z() == rhs.vertices[0]->z() && 90 this->vertices[1]->x() == rhs.vertices[1]->x() && 91 this->vertices[1]->y() == rhs.vertices[1]->y() && 92 this->vertices[1]->z() == rhs.vertices[1]->z() ) && 93 Xless<T>(this->vertices[2],rhs.vertices[2]) ) ); 94 } 95 bool operator == (gsFace const & rhs) const 96 { 97 return( 98 this->vertices[0]->x() == rhs.vertices[0]->x() && 99 this->vertices[0]->y() == rhs.vertices[0]->y() && 100 this->vertices[0]->z() == rhs.vertices[0]->z() && 101 this->vertices[1]->x() == rhs.vertices[1]->x() && 102 this->vertices[1]->y() == rhs.vertices[1]->y() && 103 this->vertices[1]->z() == rhs.vertices[1]->z() && 104 this->vertices[2]->x() == rhs.vertices[2]->x() && 105 this->vertices[2]->y() == rhs.vertices[2]->y() && 106 this->vertices[2]->z() == rhs.vertices[2]->z() ); 107 } 108 bool operator != (gsFace const & rhs)const 109 { 110 return !(*this==rhs); 111 } addVertex(gsVertexHandle const & v)112 inline void addVertex(gsVertexHandle const & v) 113 { 114 vertices.push_back( v ); 115 v->addFace(this); 116 return v; 117 } 118 move(scalar_t const & dx,scalar_t const & dy,scalar_t const & dz)119 void move(scalar_t const& dx, scalar_t const& dy, scalar_t const& dz) 120 { 121 //for ( typename 122 //it->move(dx,dy,dz) 123 } 124 print(std::ostream & os)125 std::ostream &print(std::ostream &os) const 126 { 127 os<<"gsFace: "; 128 for ( typename std::vector<gsVertexHandle>::const_iterator 129 it = vertices.begin(); it!= vertices.end(); ++it) 130 os<< (*it)->getId()<<" "; 131 os<<"\n"; 132 return os; 133 } 134 135 orthogonalVector()136 gsVector3d<T> orthogonalVector() 137 { 138 gsVector3d<T> result; 139 gsVector3d<T> lhs(((*vertices[1]).x()-(*vertices[0]).x()), 140 ((*vertices[1]).y()-(*vertices[0]).y()), 141 ((*vertices[1]).z()-(*vertices[0]).z())); 142 gsVector3d<T> rhs(((*vertices[2]).x()-(*vertices[0]).x()), 143 ((*vertices[2]).y()-(*vertices[0]).y()), 144 ((*vertices[2]).z()-(*vertices[0]).z())); 145 result = rhs.cross(lhs); 146 return result; 147 } 148 149 public: 150 151 //List of vetrices on this face 152 std::vector<gsVertexHandle> vertices; 153 std::vector<gsFaceHandle> nFaces; 154 std::vector<gsEdgeHandle> nEdges; 155 int faceIdentity; 156 }; 157 158 } // namespace gismo 159 160 161