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