2 # lmrcImageMasking.c 1.1
3 # The latest update : 01/23/97 at 10:38:49
5 #@(#) lmrcImageMasking ver 1.1
8 #@(#) Usage : lmrcImageMasking
12 static char __sccs_id[] = "@(#)lmrcImageMasking ver1.1; Date:97/01/23 @(#)";
20 #include "lmrcImageMasking.h"
23 lmrcImageMasking(mrcImage* out, mrcImage* in, lmrcImageMaskingInfo* linfo, int mode)
25 mrcImageParaTypeInteger x, y, z;
30 mrcImageParaTypeReal sx, sy, sz;
31 floatVector nx, ny, nz, cx0, cx1, cy0, cy1, cz0, cz1;
36 float x0, x1, y0, y1, z0, z1;
41 out->Header = in->Header;
44 if(linfo->flagRotation) {
45 floatVectorInit(&nx, 4);
46 floatVectorInit(&ny, 4);
47 floatVectorInit(&nz, 4);
48 floatVectorInit(&cx0, 4);
49 floatVectorInit(&cx1, 4);
50 floatVectorInit(&cy0, 4);
51 floatVectorInit(&cy1, 4);
52 floatVectorInit(&cz0, 4);
53 floatVectorInit(&cz1, 4);
54 floatVectorInit(&tmp, 4);
56 nx.data[0] = 1; nx.data[1] = 0; nx.data[2] = 0; nx.data[3] = 1;
57 ny.data[0] = 0; ny.data[1] = 1; ny.data[2] = 0; ny.data[3] = 1;
58 nz.data[0] = 0; nz.data[1] = 0; nz.data[2] = 1; nz.data[3] = 1;
60 cx0.data[0] = -linfo->n.x/2.0; cx0.data[1] = 0; cx0.data[2] = 0; cx0.data[3] = 1;
61 cx1.data[0] = +linfo->n.x/2.0; cx1.data[1] = 0; cx1.data[2] = 0; cx1.data[3] = 1;
62 cy0.data[0] = 0; cy0.data[1] = -linfo->n.y/2.0; cy0.data[2] = 0; cy0.data[3] = 1;
63 cy1.data[0] = 0; cy1.data[1] = +linfo->n.y/2.0; cy1.data[2] = 0; cy1.data[3] = 1;
64 cz0.data[0] = 0; cz0.data[1] = 0; cz0.data[2] = -linfo->n.z/2.0; cz0.data[3] = 1;
65 cz1.data[0] = 0; cz1.data[1] = 0; cz1.data[2] = +linfo->n.z/2.0; cz1.data[3] = 1;
67 tmp.data[0] = 0; tmp.data[1] = 0; tmp.data[2] = 0; tmp.data[3] = 1;
69 matrix3DRotationAntiSetFollowingEulerAngle(matRotAnti, linfo->Euler, linfo->Rot1, linfo->Rot2, linfo->Rot3, MATRIX_3D_MODE_INITIALIZE);
70 matrix3DRotationSetFollowingEulerAngle (matRot, linfo->Euler, linfo->Rot1, linfo->Rot2, linfo->Rot3, MATRIX_3D_MODE_INITIALIZE);
72 matrix3DRotationSetFollowingEulerAngle(mat, linfo->Euler, linfo->Rot1, linfo->Rot2, linfo->Rot3, MATRIX_3D_MODE_INITIALIZE);
73 matrix3DTranslationSet(mat, linfo->c.x , linfo->c.y, linfo->c.z, MATRIX_3D_MODE_NOT_INITIALIZE);
75 matrix3DMultiplyVector(&nx, matRot); DEBUGPRINT3("nx %f %f %f\n", nx.data[0], nx.data[1], nx.data[2]);
76 matrix3DMultiplyVector(&ny, matRot); DEBUGPRINT3("ny %f %f %f\n", ny.data[0], ny.data[1], ny.data[2]);
77 matrix3DMultiplyVector(&nz, matRot); DEBUGPRINT3("nz %f %f %f\n", nz.data[0], nz.data[1], nz.data[2]);
78 matrix3DMultiplyVector(&cx0, mat); DEBUGPRINT3("cx0 %f %f %f\n", cx0.data[0], cx0.data[1], cx0.data[2]);
79 matrix3DMultiplyVector(&cy0, mat); DEBUGPRINT3("cy0 %f %f %f\n", cy0.data[0], cy0.data[1], cy0.data[2]);
80 matrix3DMultiplyVector(&cz0, mat); DEBUGPRINT3("cz0 %f %f %f\n", cz0.data[0], cz0.data[1], cz0.data[2]);
81 matrix3DMultiplyVector(&cx1, mat); DEBUGPRINT3("cx1 %f %f %f\n", cx1.data[0], cx1.data[1], cx1.data[2]);
82 matrix3DMultiplyVector(&cy1, mat); DEBUGPRINT3("cy1 %f %f %f\n", cy1.data[0], cy1.data[1], cy1.data[2]);
83 matrix3DMultiplyVector(&cz1, mat); DEBUGPRINT3("cz1 %f %f %f\n", cz1.data[0], cz1.data[1], cz1.data[2]);
93 DEBUGPRINT3("shape %d mode %d rotation %d\n", linfo->shape, linfo->mode, linfo->flagRotation);
94 switch(linfo->shape) {
95 case lmrcImageMaskingInfoShapeSphere:
96 DEBUGPRINT("lmrcImageMaskingInfoShapeSphere\n");
97 sum = 0.0; count = 0; avg = 0;
98 if (linfo->mode==0){ // Calculate Average density outside a sphere
99 for(z=0; z<out->HeaderN.z; z++) {
100 for(y=0; y<out->HeaderN.y; y++) {
101 for(x=0; x<out->HeaderN.x; x++) {
102 if(!linfo->flagRotation) {
103 if(SQR((x - linfo->c.x )/(linfo->n.x/2.0))
104 + SQR((y - linfo->c.y )/(linfo->n.y/2.0))
105 + SQR((z - linfo->c.z )/(linfo->n.z/2.0)) >= 1) { // Outside
106 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
111 tmp.data[0] = x - linfo->c.x;
112 tmp.data[1] = y - linfo->c.y;
113 tmp.data[2] = z - linfo->c.z;
114 matrix3DMultiplyVector(&tmp, matRotAnti);
115 if(SQR((tmp.data[0])/(linfo->n.x/2.0))
116 + SQR((tmp.data[1])/(linfo->n.y/2.0))
117 + SQR((tmp.data[2])/(linfo->n.z/2.0)) >= 1) { // Outside
118 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
130 DEBUGPRINT2("average %f %d\n", avg, count);
132 for(z=0; z<out->HeaderN.z; z++) {
133 for(y=0; y<out->HeaderN.y; y++) {
134 for(x=0; x<out->HeaderN.x; x++) {
137 if(!linfo->flagRotation) {
138 if(SQR((x - linfo->c.x )/(linfo->n.x/2.0))
139 + SQR((y - linfo->c.y )/(linfo->n.y/2.0))
140 + SQR((z - linfo->c.z )/(linfo->n.z/2.0)) <= 1) { // Inside
141 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
145 tmp.data[0] = x -linfo->c.x;
146 tmp.data[1] = y -linfo->c.y;
147 tmp.data[2] = z -linfo->c.z;
148 matrix3DMultiplyVector(&tmp, matRotAnti);
149 if(SQR((tmp.data[0])/(linfo->n.x/2.0))
150 + SQR((tmp.data[1])/(linfo->n.y/2.0))
151 + SQR((tmp.data[2])/(linfo->n.z/2.0)) <= 1) { // Inside
152 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
159 } else if(linfo->mode==1) {
161 } else if(linfo->mode==2) {
165 mrcPixelDataSet(out, x, y, z, data, mrcPixelRePart);
171 case lmrcImageMaskingInfoSquare:
172 sum = 0.0; count = 0; avg = 0;
174 for(z=0; z<out->HeaderN.z; z++) {
175 for(y=0; y<out->HeaderN.y; y++) {
176 for(x=0; x<out->HeaderN.x; x++) {
177 if(!linfo->flagRotation) {
178 if( fabs(x - linfo->c.x ) > (linfo->n.x/2.0)
179 || fabs(y - linfo->c.y ) > (linfo->n.y/2.0)
180 || fabs(z - linfo->c.z ) > (linfo->n.z/2.0) ) { // Outside
181 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
186 x0 = (nx.data[0]*(x-cx0.data[0])+nx.data[1]*(y-cx0.data[1])+nx.data[2]*(z-cx0.data[2]));
187 x1 = (nx.data[0]*(x-cx1.data[0])+nx.data[1]*(y-cx1.data[1])+nx.data[2]*(z-cx1.data[2]));
188 y0 = (ny.data[0]*(x-cy0.data[0])+ny.data[1]*(y-cy0.data[1])+ny.data[2]*(z-cy0.data[2]));
189 y1 = (ny.data[0]*(x-cy1.data[0])+ny.data[1]*(y-cy1.data[1])+ny.data[2]*(z-cy1.data[2]));
190 z0 = (nz.data[0]*(x-cz0.data[0])+nz.data[1]*(y-cz0.data[1])+nz.data[2]*(z-cz0.data[2]));
191 z1 = (nz.data[0]*(x-cz1.data[0])+nz.data[1]*(y-cz1.data[1])+nz.data[2]*(z-cz1.data[2]));
192 if(x0*x1 > 0 || y0*y1 > 0 || z0*z1 > 0) { //
193 //DEBUGPRINT6("x0-z1: %f %f %f %f %f %f\n", x0, x1, y0, y1, z0, z1);
194 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
206 DEBUGPRINT2("average %f %d\n", avg, count);
208 for(z=0; z<out->HeaderN.z; z++) {
209 for(y=0; y<out->HeaderN.y; y++) {
210 for(x=0; x<out->HeaderN.x; x++) {
213 if(!linfo->flagRotation) {
214 //DEBUGPRINT("Not Rotated\n")
215 if( fabs(x - linfo->c.x ) <= (linfo->n.x/2.0)
216 && fabs(y - linfo->c.y ) <= (linfo->n.y/2.0)
217 && fabs(z - linfo->c.z ) <= (linfo->n.z/2.0) ) { // Inside
218 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
219 DEBUGPRINT3("(%d, %d, %d) inside square\n", x, y, z);
223 x0 = (nx.data[0]*(x-cx0.data[0])+nx.data[1]*(y-cx0.data[1])+nx.data[2]*(z-cx0.data[2]));
224 x1 = (nx.data[0]*(x-cx1.data[0])+nx.data[1]*(y-cx1.data[1])+nx.data[2]*(z-cx1.data[2]));
225 y0 = (ny.data[0]*(x-cy0.data[0])+ny.data[1]*(y-cy0.data[1])+ny.data[2]*(z-cy0.data[2]));
226 y1 = (ny.data[0]*(x-cy1.data[0])+ny.data[1]*(y-cy1.data[1])+ny.data[2]*(z-cy1.data[2]));
227 z0 = (nz.data[0]*(x-cz0.data[0])+nz.data[1]*(y-cz0.data[1])+nz.data[2]*(z-cz0.data[2]));
228 z1 = (nz.data[0]*(x-cz1.data[0])+nz.data[1]*(y-cz1.data[1])+nz.data[2]*(z-cz1.data[2]));
229 if(x0*x1 <= 0 && y0*y1 <= 0 && z0*z1 <= 0) {
230 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
237 } else if(linfo->mode==1) {
239 } else if(linfo->mode==2) {
243 mrcPixelDataSet(out, x, y, z, data, mrcPixelRePart);
249 case lmrcImageMaskingInfoCylinder:
250 sum = 0.0; count = 0; avg = 0;
252 for(z=0; z<out->HeaderN.z; z++) {
253 for(y=0; y<out->HeaderN.y; y++) {
254 for(x=0; x<out->HeaderN.x; x++) {
255 if(!linfo->flagRotation) {
256 if( SQR((x - linfo->c.x )/(linfo->n.x/2.0))
257 + SQR((y - linfo->c.y )/(linfo->n.y/2.0)) > 1
258 || fabs(z - linfo->c.z ) > (linfo->n.z/2.0) ) { // Outside
259 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
264 tmp.data[0] = x -linfo->c.x;
265 tmp.data[1] = y -linfo->c.y;
266 tmp.data[2] = z -linfo->c.z;
267 matrix3DMultiplyVector(&tmp, matRotAnti);
268 z0 = (nz.data[0]*(x-cz0.data[0])+nz.data[1]*(y-cz0.data[1])+nz.data[2]*(z-cz0.data[2]));
269 z1 = (nz.data[0]*(x-cz1.data[0])+nz.data[1]*(y-cz1.data[1])+nz.data[2]*(z-cz1.data[2]));
270 if(SQR((tmp.data[0])/(linfo->n.x/2.0))
271 + SQR((tmp.data[1])/(linfo->n.y/2.0)) > 1
272 || z0*z1 > 0) { // Outside
273 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
285 DEBUGPRINT2("average %f %d\n", avg, count);
287 for(z=0; z<out->HeaderN.z; z++) {
288 for(y=0; y<out->HeaderN.y; y++) {
289 for(x=0; x<out->HeaderN.x; x++) {
292 if(!linfo->flagRotation) {
293 //DEBUGPRINT("Not Rotated\n")
294 if(SQR((x - linfo->c.x )/(linfo->n.x/2.0))
295 + SQR((y - linfo->c.y )/(linfo->n.y/2.0)) <= 1
296 && fabs(z - linfo->c.z ) <= (linfo->n.z/2.0) ) { // Inside
297 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
299 DEBUGPRINT3("(%d, %d, %d) inside square\n", x, y, z);
302 tmp.data[0] = x -linfo->c.x;
303 tmp.data[1] = y -linfo->c.y;
304 tmp.data[2] = z -linfo->c.z;
305 matrix3DMultiplyVector(&tmp, matRotAnti);
306 z0 = (nz.data[0]*(x-cz0.data[0])+nz.data[1]*(y-cz0.data[1])+nz.data[2]*(z-cz0.data[2]));
307 z1 = (nz.data[0]*(x-cz1.data[0])+nz.data[1]*(y-cz1.data[1])+nz.data[2]*(z-cz1.data[2]));
308 if(SQR((tmp.data[0])/(linfo->n.x/2.0))
309 + SQR((tmp.data[1])/(linfo->n.y/2.0)) <= 1
310 && z0*z1 <= 0) { // Inside
311 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
318 } else if(linfo->mode==1) {
320 } else if(linfo->mode==2) {
324 mrcPixelDataSet(out, x, y, z, data, mrcPixelRePart);
330 case lmrcImageMaskingInfoRoundedSquare:
331 sum = 0.0; count = 0; avg = 0;
333 for(z=0; z<out->HeaderN.z; z++) {
334 for(y=0; y<out->HeaderN.y; y++) {
335 for(x=0; x<out->HeaderN.x; x++) {
336 if(!linfo->flagRotation) {
337 if( fabs(x - linfo->c.x ) > (linfo->n.x/2.0)
338 || fabs(y - linfo->c.y ) > (linfo->n.y/2.0)
339 || fabs(z - linfo->c.z ) > (linfo->n.z/2.0) ) { // Outside
340 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
345 x0 = (nx.data[0]*(x-cx0.data[0])+nx.data[1]*(y-cx0.data[1])+nx.data[2]*(z-cx0.data[2]));
346 x1 = (nx.data[0]*(x-cx1.data[0])+nx.data[1]*(y-cx1.data[1])+nx.data[2]*(z-cx1.data[2]));
347 y0 = (ny.data[0]*(x-cy0.data[0])+ny.data[1]*(y-cy0.data[1])+ny.data[2]*(z-cy0.data[2]));
348 y1 = (ny.data[0]*(x-cy1.data[0])+ny.data[1]*(y-cy1.data[1])+ny.data[2]*(z-cy1.data[2]));
349 z0 = (nz.data[0]*(x-cz0.data[0])+nz.data[1]*(y-cz0.data[1])+nz.data[2]*(z-cz0.data[2]));
350 z1 = (nz.data[0]*(x-cz1.data[0])+nz.data[1]*(y-cz1.data[1])+nz.data[2]*(z-cz1.data[2]));
351 if(x0*x1 > 0 || y0*y1 > 0 || z0*z1 > 0) { //
352 //DEBUGPRINT6("x0-z1: %f %f %f %f %f %f\n", x0, x1, y0, y1, z0, z1);
353 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
365 DEBUGPRINT2("average %f %d\n", avg, count);
367 for(z=0; z<out->HeaderN.z; z++) {
368 for(y=0; y<out->HeaderN.y; y++) {
369 for(x=0; x<out->HeaderN.x; x++) {
372 if(!linfo->flagRotation) {
373 //DEBUGPRINT("Not Rotated\n")
374 if( fabs(x - linfo->c.x ) <= (linfo->n.x/2.0)
375 && fabs(y - linfo->c.y ) <= (linfo->n.y/2.0)
376 && fabs(z - linfo->c.z ) <= (linfo->n.z/2.0) ) { // Inside
377 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
378 DEBUGPRINT3("(%d, %d, %d) inside square\n", x, y, z);
382 x0 = (nx.data[0]*(x-cx0.data[0])+nx.data[1]*(y-cx0.data[1])+nx.data[2]*(z-cx0.data[2]));
383 x1 = (nx.data[0]*(x-cx1.data[0])+nx.data[1]*(y-cx1.data[1])+nx.data[2]*(z-cx1.data[2]));
384 y0 = (ny.data[0]*(x-cy0.data[0])+ny.data[1]*(y-cy0.data[1])+ny.data[2]*(z-cy0.data[2]));
385 y1 = (ny.data[0]*(x-cy1.data[0])+ny.data[1]*(y-cy1.data[1])+ny.data[2]*(z-cy1.data[2]));
386 z0 = (nz.data[0]*(x-cz0.data[0])+nz.data[1]*(y-cz0.data[1])+nz.data[2]*(z-cz0.data[2]));
387 z1 = (nz.data[0]*(x-cz1.data[0])+nz.data[1]*(y-cz1.data[1])+nz.data[2]*(z-cz1.data[2]));
388 if(x0*x1 <= 0 && y0*y1 <= 0 && z0*z1 <= 0) {
389 mrcPixelDataGet(in, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
396 } else if(linfo->mode==1) {
398 } else if(linfo->mode==2) {
402 mrcPixelDataSet(out, x, y, z, data, mrcPixelRePart);
409 fprintf(stderr, "Not supported shape: %d\n", linfo->shape);