00001 
00011 #include  "Thinning.h"
00012 
00013 
00014 using namespace jbxl;
00015 
00016 
00028 int  jbxl::connectNumber(int* w, int c, int d)
00029 {
00030     int  i;
00031     int  cn, n0, n1, n2;
00032     int  v[27];
00033 
00034     if (d<3) {
00035         for(i=0; i<9; i++) v[i] = w[i];
00036         if (c==8) {
00037             v[4] = 1 - v[4];
00038             for (i=0; i<9; i++) v[i] = 1 - v[i];
00039         }
00040         if (c==4 || c==8) {
00041             cn =  v[1] - v[1]*v[0]*v[3]; 
00042             cn += v[3] - v[3]*v[6]*v[7]; 
00043             cn += v[5] - v[5]*v[2]*v[1]; 
00044             cn += v[7] - v[7]*v[8]*v[5]; 
00045         }
00046         else {
00047             cn = -1;
00048         }
00049     }
00050     else {
00051         for (i=0; i<27; i++) v[i] = w[i];
00052         if (c==26) {
00053             v[13] = 1 - v[13];
00054             for(i=0; i<27; i++) v[i] = 1 - v[i];
00055         }
00056         if (c==6 || c==26) {
00057         n0 = v[13]*v[14] + v[13]*v[12] +
00058              v[13]*v[16] + v[13]*v[10] +
00059              v[13]*v[22] + v[13]*v[ 4];
00060 
00061         n1 = v[13]*v[14]*v[10]*v[11] + v[13]*v[14]*v[16]*v[17] +
00062              v[13]*v[14]*v[ 4]*v[ 5] + v[13]*v[14]*v[22]*v[23] +
00063              v[13]*v[12]*v[10]*v[ 9] + v[13]*v[12]*v[16]*v[15] +
00064              v[13]*v[12]*v[ 4]*v[ 3] + v[13]*v[12]*v[22]*v[21] +
00065              v[13]*v[10]*v[ 4]*v[ 1] + v[13]*v[10]*v[22]*v[19] +
00066              v[13]*v[16]*v[ 4]*v[ 7] + v[13]*v[16]*v[22]*v[25];
00067 
00068         n2 = v[13]*v[14]*v[10]*v[11]*v[ 4]*v[ 5]*v[ 1]*v[ 2] +
00069              v[13]*v[14]*v[10]*v[11]*v[22]*v[23]*v[19]*v[20] +
00070              v[13]*v[14]*v[16]*v[17]*v[ 4]*v[ 5]*v[ 7]*v[ 8] +
00071              v[13]*v[14]*v[16]*v[17]*v[22]*v[23]*v[25]*v[26] +
00072              v[13]*v[12]*v[10]*v[ 9]*v[ 4]*v[ 3]*v[ 1]*v[ 0] +
00073              v[13]*v[12]*v[10]*v[ 9]*v[22]*v[21]*v[19]*v[18] +
00074              v[13]*v[12]*v[16]*v[15]*v[ 4]*v[ 3]*v[ 7]*v[ 6] +
00075              v[13]*v[12]*v[16]*v[15]*v[22]*v[21]*v[25]*v[24];
00076 
00077             cn = n0 - n1 + n2;
00078             if (c==26) cn = 2 - cn; 
00079         }
00080         else {
00081             cn = -1;
00082         }
00083     }
00084 
00085     return  cn;
00086 }
00087 
00088 
00089 bool  jbxl::deletable_s(int* v)
00090 {
00091     int  s;
00092 
00093     s = (1-v[ 6])*v[ 3]*v[ 7]*v[ 4]*v[12]*v[15]*v[16] +
00094         (1-v[ 8])*v[ 7]*v[ 5]*v[ 4]*v[16]*v[17]*v[14] +
00095         (1-v[ 2])*v[ 5]*v[ 1]*v[ 4]*v[14]*v[11]*v[10] +
00096         (1-v[ 0])*v[ 1]*v[ 3]*v[ 4]*v[10]*v[ 9]*v[12] +
00097         (1-v[24])*v[21]*v[25]*v[22]*v[12]*v[15]*v[16] +
00098         (1-v[26])*v[25]*v[23]*v[22]*v[16]*v[17]*v[14] +
00099         (1-v[20])*v[23]*v[19]*v[22]*v[14]*v[11]*v[10] +
00100         (1-v[18])*v[19]*v[21]*v[22]*v[10]*v[ 9]*v[12];
00101 
00102     if (s==1) return false;
00103     else      return true;
00104 }
00105 
00106 
00107 bool  jbxl::deletable_4(int* v)
00108 {
00109     int  i, w[6], u[6];
00110 
00111     bool ret = deletable_s(v);
00112     if (!ret) return false;
00113 
00114     u[0] = v[ 4];
00115     u[1] = v[10];
00116     u[2] = v[12];
00117     u[3] = v[14];
00118     u[4] = v[16];
00119     u[5] = v[22];
00120 
00121     for(i=0; i<6; i++)   w[i] = 0;
00122 
00123     if (v[ 1]==1) w[0] = w[1] = 1;
00124     if (v[ 3]==1) w[0] = w[2] = 1;
00125     if (v[ 5]==1) w[0] = w[3] = 1;
00126     if (v[ 7]==1) w[0] = w[4] = 1;
00127     if (v[ 9]==1) w[1] = w[2] = 1;
00128     if (v[11]==1) w[1] = w[3] = 1;
00129     if (v[15]==1) w[2] = w[4] = 1;
00130     if (v[17]==1) w[3] = w[4] = 1;
00131     if (v[19]==1) w[1] = w[5] = 1;
00132     if (v[21]==1) w[2] = w[5] = 1;
00133     if (v[23]==1) w[3] = w[5] = 1;
00134     if (v[25]==1) w[4] = w[5] = 1;
00135 
00136     ret = true;
00137     for(i=0; i<6; i++) if (w[i]==0 && u[i]==1) ret = false;
00138     
00139     return  ret;
00140 }
00141 
00142 
00143 bool  jbxl::deletable_5(int* v)
00144 {
00145     int  i, j, k, m, s;
00146     int  mz[6][6], mx[6][6], mm[6][6];
00147 
00148     mm[0][1] = mm[1][0] = v[ 3];
00149     mm[0][2] = mm[2][0] = v[ 7];
00150     mm[0][3] = mm[3][0] = v[ 1];
00151     mm[0][4] = mm[4][0] = v[ 5];
00152     mm[1][2] = mm[2][1] = v[15];
00153     mm[1][3] = mm[3][1] = v[ 9];
00154     mm[1][5] = mm[5][1] = v[21];
00155     mm[2][4] = mm[4][2] = v[17];
00156     mm[2][5] = mm[5][2] = v[25];
00157     mm[3][4] = mm[4][3] = v[11];
00158     mm[3][5] = mm[5][3] = v[19];
00159     mm[4][5] = mm[5][4] = v[23];
00160 
00161     for(i=0; i<6; i++) {            
00162         for(j=0; j<6; j++) {
00163             mx[i][j] = mm[i][j];
00164             if (i==j) mx[i][i]++;
00165         }
00166     }
00167 
00168     for(i=0; i<6; i++) {            
00169         for(j=0; j<6; j++) {
00170             m = 0;
00171             for(k=0; k<6; k++) {
00172                 m = m + mm[i][k]*mx[k][j];
00173             }
00174             mz[i][j] = m; 
00175         }
00176     }
00177         
00178     for(i=0; i<6; i++) {            
00179         mz[i][i] = 1 + mz[i][i];
00180     }
00181 
00182     for(i=0; i<6; i++) {            
00183         for(j=0; j<6; j++) {
00184             m = 0;
00185             for(k=0; k<6; k++) {
00186                 m = m + mm[i][k]*mz[k][j];
00187             }
00188             mx[i][j] = m; 
00189         }
00190     }
00191 
00192     for(i=0; i<6; i++) {            
00193         mx[i][i] = 1 + mx[i][i];
00194     }
00195 
00196     for(i=0; i<6; i++) {            
00197         for(j=0; j<6; j++) {
00198             m = 0;
00199             for(k=0; k<6; k++) {
00200                 m = m + mm[i][k]*mx[k][j];
00201             }
00202             mz[i][j] = m; 
00203         }
00204     }
00205 
00206     for(i=0; i<6; i++) {            
00207         mz[i][i] = 1 + mz[i][i];
00208     }
00209 
00210     s = 1;
00211     for(i=0; i<6; i++) {            
00212         for(j=0; j<6; j++) {
00213             m = 0;
00214             for(k=0; k<6; k++) {
00215                 m = m + mm[i][k]*mz[k][j];
00216             }
00217             s = s*m; 
00218         }
00219     }
00220 
00221     if (s==0)  return  false;
00222     else       return  true;
00223 }
00224     
00225 
00226 
00227