Initial snark14m import
[snark14.git] / src / snark / point.cpp
1 /*
2  ***********************************************************
3  $SNARK_Header: S N A R K  1 4 - A PICTURE RECONSTRUCTION PROGRAM $
4  $HeadURL: svn://dig.cs.gc.cuny.edu/snark/trunk/src/snark/point.cpp $
5  $LastChangedRevision: 80 $
6  $Date: 2014-07-01 21:01:54 -0400 (Tue, 01 Jul 2014) $
7  $Author: agulati $
8  ***********************************************************
9
10  THIS SUBROUTINE PRODUCES THE POINT BY POINT RESOLUTION OF THE
11  RECONSTRUCTED PICTURE.  THIS MEASURE IS SIMILAR TO THAT DEFINED
12  IN FRIEDER AND HERMAN (J. THEOR. BIOL., VOL. 33, PP. 189-211),
13  HOWEVER, THE NUMBER OF SQUARES OF THE DIFFERENT SIZES HAS BEEN
14  GREATLY REDUCED TO MAKE THIS COMPUTATIONALLY FEASIBLE.
15  */
16
17 #include <cstdio>
18 #include <cstdlib>
19 #include <cmath>
20
21 #include "blkdta.h"
22 #include "uiod.h"
23 #include "eval.h"
24
25 void Eval_class::point(REAL* a, REAL* b, REAL* c, INTEGER nelem, INTEGER* nerr,
26                 REAL*epsil)
27 {
28         int i, j, k;
29
30         INTEGER nh;
31         INTEGER nw;
32         INTEGER narea;
33         REAL cmax;
34         INTEGER nnh;
35         INTEGER nnw;
36         INTEGER ij;
37         INTEGER ik;
38         INTEGER ii;
39         INTEGER ii1;
40         INTEGER ii2;
41         INTEGER ii3;
42
43         *nerr = (INTEGER) (log((REAL) nelem) / log((REAL) 2) + 1.0);
44         if ((*nerr) > 15)
45         {
46                 fprintf(output, "\n **** image is too large for evaluation");
47                 fprintf(output, "\n **** program aborted\n");
48                 fprintf(output, "\n");
49                 exit(-1);
50         }
51
52         nh = nelem;
53         nw = nelem;
54         narea = nelem * nelem;
55
56         // COMPUTE THE DIFFERENCE PICTURE
57
58         for (i = 0; i < narea; i++)
59         {
60                 c[i] = a[i] - b[i];
61         }
62
63         for (k = 0; k < *nerr; k++)
64         {
65                 cmax = 0.0;
66                 // FIND THE MAXIMUM PICTURE ELEMENT
67                 for (i = 0; i < narea; i++)
68                 {  //changed from 'i=1' to 'i=0' (Joel)
69                         cmax = MAX0((REAL) fabs(c[i]), cmax);
70                 }
71
72                 epsil[k] = cmax;
73
74                 /*
75                  REDUCE THE SIZE OF THE PICTURE BY AVERAGING 2X2 SQUARES,
76                  DISCARDING REMAINING ODD SQUARES.  FOR EXAMPLE, IF THE ORIGINAL
77                  PICTURE WAS 63X63, SUCESSIVE AVERAGED PICTURE SIZES WOULD BE
78                  31X31, 15X15, 7X7, 3X3, AND 1X1.
79                  */
80
81                 nnh = nh / 2;
82                 nnw = nw / 2;
83                 ij = 0;           // used to be 'ij = 1' (Joel 8-12-03)
84                 ik = 0;           // used to be 'ik = 1' (Joel 8-12-03)
85                 for (i = 0; i < nnh; i++)
86                 {
87
88                         ii = ik;
89                         for (j = 0; j < nnw; j++)
90                         {
91                                 ii1 = ii + nw;
92                                 ii2 = ii + 1;
93                                 ii3 = ii1 + 1;
94                                 c[ij] = (REAL) 0.25 * (c[ii] + c[ii1] + c[ii2] + c[ii3]);
95                                 ii = ii + 2;
96                                 ij = ij + 1;
97                         }
98                         ik = ik + nw + nw;
99                 }
100
101                 nh = nnh;
102                 nw = nnw;
103                 narea = nh * nw;
104         }
105         return;
106 }