00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SUBDIIII_H_
00024 #define SUBDIIII_H_
00025
00026 void Act_on_subdivision_partIII(Bo_description* Description,
00027 Calculator_FE* Act,
00028 bool* corners, bool& stop) {
00029
00030 int i;
00031
00032 Edge_Corner_point poi_1, poi_2, poi_3, poi_4;
00033 Edge_Corner_point poi_5, poi_6, poi_7, poi_8;
00034 Edge_Corner_point poi_9, poi_10;
00035 Edge_Corner_point poi_A, poi_B, poi_C, poi_D;
00036 Edge_Corner_point poi_A2, poi_B2, poi_C2;
00037 Edge_Corner_point poi_oppA, poi_oppB, poi_oppC;
00038
00039 dir_sons oppA, oppB, oppC;
00040 bool later_stop, LA, LB, LC;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 later_stop = false;
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 for(i=0;i<8 && !stop;++i) {
00062
00063 poi_D.edge_point = corner_poi_typ;
00064 poi_D.corner = (dir_sons)i;
00065
00066
00067 poi_oppA.edge_point = poi_oppB.edge_point =
00068 poi_oppC.edge_point = corner_poi_typ;
00069
00070 oppA = Next_corner((dir_sons)i,opposite3D(xCoord((dir_sons)i)));
00071 oppB = Next_corner((dir_sons)i,opposite3D(yCoord((dir_sons)i)));
00072 oppC = Next_corner((dir_sons)i,opposite3D(zCoord((dir_sons)i)));
00073
00074 poi_oppA.corner = oppA;
00075 poi_oppB.corner = oppB;
00076 poi_oppC.corner = oppC;
00077
00078
00079 poi_A.edge_point = poi_B.edge_point = poi_C.edge_point = edge_poi_typ;
00080 poi_A2.edge_point = poi_B2.edge_point = poi_C2.edge_point = edge_poi_typ;
00081
00082 poi_A.corner = oppA; poi_A.d = opposite3D(yCoord((dir_sons)i));
00083 poi_A2.corner = oppA; poi_A2.d = opposite3D(zCoord((dir_sons)i));
00084 poi_B.corner = oppB; poi_B.d = opposite3D(xCoord((dir_sons)i));
00085 poi_B2.corner = oppB; poi_B2.d = opposite3D(zCoord((dir_sons)i));
00086 poi_C.corner = oppC; poi_C.d = opposite3D(xCoord((dir_sons)i));
00087 poi_C2.corner = oppC; poi_C2.d = opposite3D(yCoord((dir_sons)i));
00088
00089 if(Description->edge_point(poi_A) && Description->edge_point(poi_A2) &&
00090 Description->edge_point(poi_B) && Description->edge_point(poi_B2) &&
00091 Description->edge_point(poi_C) && Description->edge_point(poi_C2)
00092 && corners[i] && corners[oppA] && corners[oppB] && corners[oppC]) {
00093 corners[i] = corners[oppA] = corners[oppB] = corners[oppC] = false;
00094
00095 later_stop = true;
00096 if(((((i>>2)&1) + ((i>>1)&1) + ((i>>0)&1))&1)==0) {
00097
00098 poi_10 = poi_D;
00099
00100 poi_7 = poi_oppA;
00101 poi_6 = poi_A;
00102 poi_8 = poi_A2;
00103
00104 poi_4 = poi_oppB;
00105 poi_3 = poi_B2;
00106 poi_5 = poi_B;
00107
00108 poi_1 = poi_oppC;
00109 poi_2 = poi_C2;
00110 poi_9 = poi_C;
00111 }
00112 else {
00113
00114 poi_10 = poi_D;
00115
00116 poi_7 = poi_oppA;
00117 poi_6 = poi_A2;
00118 poi_8 = poi_A;
00119
00120 poi_4 = poi_oppC;
00121 poi_3 = poi_C2;
00122 poi_5 = poi_C;
00123
00124 poi_1 = poi_oppB;
00125 poi_2 = poi_B2;
00126 poi_9 = poi_B;
00127 }
00128
00129 Act->Tetraeder(poi_10,poi_2,poi_9,poi_1);
00130 Act->Tetraeder(poi_10,poi_6,poi_7,poi_8);
00131 Act->Tetraeder(poi_10,poi_4,poi_5,poi_3);
00132
00133 LA = Description->h(poi_9.corner, poi_9.d) <
00134 Description->h(poi_2.corner, poi_2.d);
00135 LB = Description->h(poi_3.corner, poi_3.d) <
00136 Description->h(poi_5.corner, poi_5.d);
00137 LC = Description->h(poi_6.corner, poi_6.d) <
00138 Description->h(poi_8.corner, poi_8.d);
00139
00140
00141 if(LA && LB && LC) {
00142 Act->Tetraeder(poi_10,poi_8,poi_9,poi_2);
00143 Act->Tetraeder(poi_10,poi_2,poi_3,poi_5);
00144 Act->Tetraeder(poi_10,poi_5,poi_6,poi_8);
00145 Act->Tetraeder(poi_10,poi_8,poi_2,poi_5);
00146 }
00147 else if(!LA && !LB && !LC) {
00148 Act->Tetraeder(poi_10,poi_3,poi_9,poi_2);
00149 Act->Tetraeder(poi_10,poi_5,poi_6,poi_3);
00150 Act->Tetraeder(poi_10,poi_6,poi_8,poi_9);
00151 Act->Tetraeder(poi_10,poi_9,poi_3,poi_6);
00152 }
00153 else {
00154 if(LA && !LC) {
00155 poi_7 = poi_2; poi_1 = poi_3;
00156 poi_2 = poi_5; poi_3 = poi_6;
00157 poi_5 = poi_8; poi_6 = poi_9;
00158 poi_8 = poi_7; poi_9 = poi_1;
00159 }
00160 if(LB && !LA) {
00161 poi_4 = poi_9; poi_1 = poi_8;
00162 poi_9 = poi_6; poi_8 = poi_5;
00163 poi_6 = poi_3; poi_5 = poi_2;
00164 poi_3 = poi_4; poi_2 = poi_1;
00165 }
00166 Act->Tetraeder(poi_10,poi_5,poi_8,poi_3);
00167 Act->Tetraeder(poi_10,poi_6,poi_8,poi_5);
00168 if(Description->h(poi_9.corner, poi_9.d) <
00169 Description->h(poi_2.corner, poi_2.d)) {
00170 Act->Tetraeder(poi_10,poi_8,poi_9,poi_2);
00171 Act->Tetraeder(poi_10,poi_3,poi_8,poi_2);
00172 }
00173 else {
00174 Act->Tetraeder(poi_10,poi_3,poi_9,poi_2);
00175 Act->Tetraeder(poi_10,poi_3,poi_8,poi_9);
00176 }
00177 }
00178 }
00179 }
00180
00181 if(later_stop) stop = true;
00182 }
00183
00184 #endif
00185