[3913] | 1 | #ifndef _TRIANGLE_H_
|
---|
| 2 | #define _TRIANGLE_H_
|
---|
| 3 |
|
---|
| 4 | #include "./include.h"
|
---|
[5143] | 5 | #include "AdjacentTriangle.h"
|
---|
[3913] | 6 |
|
---|
| 7 | namespace bamg {
|
---|
| 8 |
|
---|
| 9 | //classes
|
---|
[5095] | 10 | class Mesh;
|
---|
[5120] | 11 | class BamgVertex;
|
---|
[3913] | 12 | class Triangle;
|
---|
| 13 |
|
---|
| 14 | class Triangle {
|
---|
| 15 |
|
---|
[5143] | 16 | friend class AdjacentTriangle;
|
---|
[3913] | 17 |
|
---|
| 18 | private:
|
---|
[5148] | 19 | BamgVertex *vertices[3]; // 3 vertices if t is triangle, t[i] allowed by access function, (*t)[i] if pointer
|
---|
| 20 | Triangle *adj[3]; // 3 pointers toward the adjacent triangles
|
---|
| 21 | short AdjEdgeNumber[3]; // edge id in the adjacent triangles. The edge number 1 is the edge number AdjEdgeNumber[1] in the Adjacent triangle 1
|
---|
[3913] | 22 |
|
---|
| 23 | public:
|
---|
[5143] | 24 | Icoor2 det; //Integer determinant (twice its area)
|
---|
[3913] | 25 | union {
|
---|
[5143] | 26 | Triangle *link;
|
---|
| 27 | long color;
|
---|
[3913] | 28 | };
|
---|
| 29 |
|
---|
| 30 | //Constructors/Destructors
|
---|
| 31 | Triangle() {}
|
---|
[5095] | 32 | Triangle(Mesh *Th,long i,long j,long k);
|
---|
[5120] | 33 | Triangle(BamgVertex *v0,BamgVertex *v1,BamgVertex *v2);
|
---|
[3913] | 34 |
|
---|
| 35 | //Operators
|
---|
[5148] | 36 | const BamgVertex & operator[](int i) const {return *vertices[i];};
|
---|
| 37 | BamgVertex & operator[](int i) {return *vertices[i];};
|
---|
| 38 | const BamgVertex * operator()(int i) const {return vertices[i];};
|
---|
| 39 | BamgVertex * & operator()(int i) {return vertices[i];};
|
---|
[3913] | 40 |
|
---|
| 41 | //Methods
|
---|
| 42 | void Echo();
|
---|
| 43 | int swap(short a1,int=0);
|
---|
| 44 | long Optim(short a,int =0);
|
---|
[5148] | 45 | int Locked(int a)const { return AdjEdgeNumber[a]&4;}
|
---|
| 46 | int Hidden(int a)const { return AdjEdgeNumber[a]&16;}
|
---|
| 47 | int GetAllflag(int a){return AdjEdgeNumber[a] & 1020;}
|
---|
| 48 | void SetAllFlag(int a,int f){AdjEdgeNumber[a] = (AdjEdgeNumber[a] &3) + (1020 & f);}
|
---|
[3913] | 49 | double QualityQuad(int a,int option=1) const;
|
---|
[5148] | 50 | short NuEdgeTriangleAdj(int i) const {return AdjEdgeNumber[i&3]&3;} // Number of the adjacent edge in adj tria
|
---|
[5143] | 51 | AdjacentTriangle FindBoundaryEdge(int i) const;
|
---|
[5148] | 52 | AdjacentTriangle Adj(int i) const {return AdjacentTriangle(adj[i],AdjEdgeNumber[i]&3);};
|
---|
| 53 | Triangle* TriangleAdj(int i) const {return adj[i&3];}
|
---|
[5120] | 54 | Triangle* Quadrangle(BamgVertex * & v0,BamgVertex * & v1,BamgVertex * & v2,BamgVertex * & v3) const ;
|
---|
[5124] | 55 | void Renumbering(Triangle *tb,Triangle *te, long *renu){
|
---|
[3913] | 56 | if (link >=tb && link <te) link = tb + renu[link -tb];
|
---|
[5148] | 57 | if (adj[0] >=tb && adj[0] <te) adj[0] = tb + renu[adj[0]-tb];
|
---|
| 58 | if (adj[1] >=tb && adj[1] <te) adj[1] = tb + renu[adj[1]-tb];
|
---|
| 59 | if (adj[2] >=tb && adj[2] <te) adj[2] = tb + renu[adj[2]-tb];
|
---|
[3913] | 60 | }
|
---|
[5124] | 61 | void Renumbering(BamgVertex *vb,BamgVertex *ve, long *renu){
|
---|
[5148] | 62 | if (vertices[0] >=vb && vertices[0] <ve) vertices[0] = vb + renu[vertices[0]-vb];
|
---|
| 63 | if (vertices[1] >=vb && vertices[1] <ve) vertices[1] = vb + renu[vertices[1]-vb];
|
---|
| 64 | if (vertices[2] >=vb && vertices[2] <ve) vertices[2] = vb + renu[vertices[2]-vb];
|
---|
[3913] | 65 | }
|
---|
| 66 | void SetAdjAdj(short a){
|
---|
| 67 | a &= 3;
|
---|
[5148] | 68 | register Triangle *tt=adj[a];
|
---|
| 69 | AdjEdgeNumber [a] &= 55; // remove MarkUnSwap
|
---|
| 70 | register short aatt = AdjEdgeNumber[a] & 3;
|
---|
[3913] | 71 | if(tt){
|
---|
[5148] | 72 | tt->adj[aatt]=this;
|
---|
| 73 | tt->AdjEdgeNumber[aatt]=a + (AdjEdgeNumber[a] & 60 ) ;}// Copy all the mark
|
---|
[3913] | 74 | }
|
---|
| 75 | void SetAdj2(short a,Triangle *t,short aat){
|
---|
[5148] | 76 | adj[a]=t; //the adjacent triangle to the edge a is t
|
---|
| 77 | AdjEdgeNumber[a]=aat; //position of the edge in the adjacent triangle
|
---|
[3913] | 78 | if(t) { //if t!=NULL add adjacent triangle to t (this)
|
---|
[5148] | 79 | t->adj[aat]=this;
|
---|
| 80 | t->AdjEdgeNumber[aat]=a;
|
---|
[3913] | 81 | }
|
---|
| 82 | }
|
---|
[5124] | 83 | void SetSingleVertexToTriangleConnectivity() {
|
---|
[5148] | 84 | if (vertices[0]) (vertices[0]->t=this,vertices[0]->vint=0);
|
---|
| 85 | if (vertices[1]) (vertices[1]->t=this,vertices[1]->vint=1);
|
---|
| 86 | if (vertices[2]) (vertices[2]->t=this,vertices[2]->vint=2);
|
---|
[3913] | 87 | }
|
---|
| 88 | void SetHidden(int a){
|
---|
| 89 | //Get Adjacent Triangle number a
|
---|
[5148] | 90 | register Triangle* t = adj[a];
|
---|
[3913] | 91 | //if it exist
|
---|
| 92 | //C|=D -> C=(C|D) bitwise inclusive OR
|
---|
[5148] | 93 | if(t) t->AdjEdgeNumber[AdjEdgeNumber[a] & 3] |=16;
|
---|
| 94 | AdjEdgeNumber[a] |= 16;
|
---|
[3913] | 95 | }
|
---|
| 96 |
|
---|
| 97 | void SetLocked(int a){
|
---|
| 98 | //mark the edge as on Boundary
|
---|
[5148] | 99 | register Triangle * t = adj[a];
|
---|
| 100 | t->AdjEdgeNumber[AdjEdgeNumber[a] & 3] |=4;
|
---|
| 101 | AdjEdgeNumber[a] |= 4;
|
---|
[3913] | 102 | }
|
---|
| 103 | void SetMarkUnSwap(int a){
|
---|
[5148] | 104 | register Triangle * t = adj[a];
|
---|
| 105 | t->AdjEdgeNumber[AdjEdgeNumber[a] & 3] |=8;
|
---|
| 106 | AdjEdgeNumber[a] |=8 ;
|
---|
[3913] | 107 | }
|
---|
| 108 | void SetUnMarkUnSwap(int a){
|
---|
[5148] | 109 | register Triangle * t = adj[a];
|
---|
| 110 | t->AdjEdgeNumber[AdjEdgeNumber[a] & 3] &=55; // 23 + 32
|
---|
| 111 | AdjEdgeNumber[a] &=55 ;
|
---|
[3913] | 112 | }
|
---|
| 113 | void SetDet() {
|
---|
[5148] | 114 | if(vertices[0] && vertices[1] && vertices[2]) det = bamg::det(*vertices[0],*vertices[1],*vertices[2]);
|
---|
[3913] | 115 | else det = -1; }
|
---|
| 116 |
|
---|
| 117 | //Inline methods
|
---|
| 118 | double qualite() ;
|
---|
[5095] | 119 | void Set(const Triangle &,const Mesh &,Mesh &);
|
---|
[5148] | 120 | int In(BamgVertex *v) const { return vertices[0]==v || vertices[1]==v || vertices[2]==v ;}
|
---|
[3913] | 121 |
|
---|
| 122 | };
|
---|
| 123 |
|
---|
| 124 | }
|
---|
| 125 | #endif
|
---|