source: issm/trunk/src/c/objects/Bamg/Triangle.h@ 5148

Last change on this file since 5148 was 5148, checked in by Mathieu Morlighem, 15 years ago

as usual

File size: 4.5 KB
RevLine 
[3913]1#ifndef _TRIANGLE_H_
2#define _TRIANGLE_H_
3
4#include "./include.h"
[5143]5#include "AdjacentTriangle.h"
[3913]6
7namespace 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
Note: See TracBrowser for help on using the repository browser.