JunkBox_Lib++ (for Windows) 1.10.1
Loading...
Searching...
No Matches
Thinning.cpp
Go to the documentation of this file.
1
9#include "Thinning.h"
10
11
12using namespace jbxl;
13
14
26int jbxl::connectNumber(int* w, int c, int d)
27{
28 int i;
29 int cn, n0, n1, n2;
30 int v[27];
31
32 if (d<3) {
33 for(i=0; i<9; i++) v[i] = w[i];
34 if (c==8) {
35 v[4] = 1 - v[4];
36 for (i=0; i<9; i++) v[i] = 1 - v[i];
37 }
38 if (c==4 || c==8) {
39 cn = v[1] - v[1]*v[0]*v[3];
40 cn += v[3] - v[3]*v[6]*v[7];
41 cn += v[5] - v[5]*v[2]*v[1];
42 cn += v[7] - v[7]*v[8]*v[5];
43 }
44 else {
45 cn = -1;
46 }
47 }
48 else {
49 for (i=0; i<27; i++) v[i] = w[i];
50 if (c==26) {
51 v[13] = 1 - v[13];
52 for(i=0; i<27; i++) v[i] = 1 - v[i];
53 }
54 if (c==6 || c==26) {
55 n0 = v[13]*v[14] + v[13]*v[12] +
56 v[13]*v[16] + v[13]*v[10] +
57 v[13]*v[22] + v[13]*v[ 4];
58
59 n1 = v[13]*v[14]*v[10]*v[11] + v[13]*v[14]*v[16]*v[17] +
60 v[13]*v[14]*v[ 4]*v[ 5] + v[13]*v[14]*v[22]*v[23] +
61 v[13]*v[12]*v[10]*v[ 9] + v[13]*v[12]*v[16]*v[15] +
62 v[13]*v[12]*v[ 4]*v[ 3] + v[13]*v[12]*v[22]*v[21] +
63 v[13]*v[10]*v[ 4]*v[ 1] + v[13]*v[10]*v[22]*v[19] +
64 v[13]*v[16]*v[ 4]*v[ 7] + v[13]*v[16]*v[22]*v[25];
65
66 n2 = v[13]*v[14]*v[10]*v[11]*v[ 4]*v[ 5]*v[ 1]*v[ 2] +
67 v[13]*v[14]*v[10]*v[11]*v[22]*v[23]*v[19]*v[20] +
68 v[13]*v[14]*v[16]*v[17]*v[ 4]*v[ 5]*v[ 7]*v[ 8] +
69 v[13]*v[14]*v[16]*v[17]*v[22]*v[23]*v[25]*v[26] +
70 v[13]*v[12]*v[10]*v[ 9]*v[ 4]*v[ 3]*v[ 1]*v[ 0] +
71 v[13]*v[12]*v[10]*v[ 9]*v[22]*v[21]*v[19]*v[18] +
72 v[13]*v[12]*v[16]*v[15]*v[ 4]*v[ 3]*v[ 7]*v[ 6] +
73 v[13]*v[12]*v[16]*v[15]*v[22]*v[21]*v[25]*v[24];
74
75 cn = n0 - n1 + n2;
76 if (c==26) cn = 2 - cn;
77 }
78 else {
79 cn = -1;
80 }
81 }
82 return cn;
83}
84
85
87{
88 int s;
89
90 s = (1-v[ 6])*v[ 3]*v[ 7]*v[ 4]*v[12]*v[15]*v[16] +
91 (1-v[ 8])*v[ 7]*v[ 5]*v[ 4]*v[16]*v[17]*v[14] +
92 (1-v[ 2])*v[ 5]*v[ 1]*v[ 4]*v[14]*v[11]*v[10] +
93 (1-v[ 0])*v[ 1]*v[ 3]*v[ 4]*v[10]*v[ 9]*v[12] +
94 (1-v[24])*v[21]*v[25]*v[22]*v[12]*v[15]*v[16] +
95 (1-v[26])*v[25]*v[23]*v[22]*v[16]*v[17]*v[14] +
96 (1-v[20])*v[23]*v[19]*v[22]*v[14]*v[11]*v[10] +
97 (1-v[18])*v[19]*v[21]*v[22]*v[10]*v[ 9]*v[12];
98
99 if (s==1) return false;
100 else return true;
101}
102
103
105{
106 int i, w[6], u[6];
107
108 bool ret = deletable_s(v);
109 if (!ret) return false;
110
111 u[0] = v[ 4];
112 u[1] = v[10];
113 u[2] = v[12];
114 u[3] = v[14];
115 u[4] = v[16];
116 u[5] = v[22];
117
118 for(i=0; i<6; i++) w[i] = 0;
119
120 if (v[ 1]==1) w[0] = w[1] = 1;
121 if (v[ 3]==1) w[0] = w[2] = 1;
122 if (v[ 5]==1) w[0] = w[3] = 1;
123 if (v[ 7]==1) w[0] = w[4] = 1;
124 if (v[ 9]==1) w[1] = w[2] = 1;
125 if (v[11]==1) w[1] = w[3] = 1;
126 if (v[15]==1) w[2] = w[4] = 1;
127 if (v[17]==1) w[3] = w[4] = 1;
128 if (v[19]==1) w[1] = w[5] = 1;
129 if (v[21]==1) w[2] = w[5] = 1;
130 if (v[23]==1) w[3] = w[5] = 1;
131 if (v[25]==1) w[4] = w[5] = 1;
132
133 ret = true;
134 for(i=0; i<6; i++) if (w[i]==0 && u[i]==1) ret = false;
135
136 return ret;
137}
138
139
141{
142 int i, j, k, m, s;
143 int mz[6][6], mx[6][6], mm[6][6];
144
145 mm[0][1] = mm[1][0] = v[ 3];
146 mm[0][2] = mm[2][0] = v[ 7];
147 mm[0][3] = mm[3][0] = v[ 1];
148 mm[0][4] = mm[4][0] = v[ 5];
149 mm[1][2] = mm[2][1] = v[15];
150 mm[1][3] = mm[3][1] = v[ 9];
151 mm[1][5] = mm[5][1] = v[21];
152 mm[2][4] = mm[4][2] = v[17];
153 mm[2][5] = mm[5][2] = v[25];
154 mm[3][4] = mm[4][3] = v[11];
155 mm[3][5] = mm[5][3] = v[19];
156 mm[4][5] = mm[5][4] = v[23];
157
158 for(i=0; i<6; i++) { // I+M
159 for(j=0; j<6; j++) {
160 mx[i][j] = mm[i][j];
161 if (i==j) mx[i][i]++;
162 }
163 }
164
165 for(i=0; i<6; i++) { // M(I+M)
166 for(j=0; j<6; j++) {
167 m = 0;
168 for(k=0; k<6; k++) {
169 m = m + mm[i][k]*mx[k][j];
170 }
171 mz[i][j] = m;
172 }
173 }
174
175 for(i=0; i<6; i++) { // I+M(I+M)
176 mz[i][i] = 1 + mz[i][i];
177 }
178
179 for(i=0; i<6; i++) { // M(I+M(I+M))
180 for(j=0; j<6; j++) {
181 m = 0;
182 for(k=0; k<6; k++) {
183 m = m + mm[i][k]*mz[k][j];
184 }
185 mx[i][j] = m;
186 }
187 }
188
189 for(i=0; i<6; i++) { // I+M(I+M(I+M))
190 mx[i][i] = 1 + mx[i][i];
191 }
192
193 for(i=0; i<6; i++) { // M(I+M(I+M(I+M)))
194 for(j=0; j<6; j++) {
195 m = 0;
196 for(k=0; k<6; k++) {
197 m = m + mm[i][k]*mx[k][j];
198 }
199 mz[i][j] = m;
200 }
201 }
202
203 for(i=0; i<6; i++) { // I+M(I+M(I+M(I+M)))
204 mz[i][i] = 1 + mz[i][i];
205 }
206
207 s = 1;
208 for(i=0; i<6; i++) { // M(I+M(I+M(I+M(I+M))))
209 for(j=0; j<6; j++) {
210 m = 0;
211 for(k=0; k<6; k++) {
212 m = m + mm[i][k]*mz[k][j];
213 }
214 s = s*m;
215 }
216 }
217
218 if (s==0) return false;
219 else return true;
220}
細線化関数
Definition Brep.h:29
int connectNumber(int *w, int c, int d)
Definition Thinning.cpp:26
bool deletable_4(int *v)
Definition Thinning.cpp:104
bool deletable_5(int *v)
Definition Thinning.cpp:140
bool deletable_s(int *v)
Definition Thinning.cpp:86