6 #define E_UNIMPLEMENTED -1
7 #define E_ILLEGAL_COORDINATES -2
8 #define E_UNINITIALIZED -3
10 #define E_MALFORMED_INPUT -5
11 #define E_BAD_VALUES -6
21 static struct cell
*grid
;
22 static size_t g_len
= -1;
26 static int g_width
, g_height
;
28 static void compute_sins(void)
32 for (m
= 0; m
< g_len
; ++m
)
33 grid
[m
].c_sin
= sin(grid
[m
].beta
+ t
* grid
[m
].alpha
);
38 floor(1.0 / fabs(grid[i].c_sin - grid[i].n_avg)); \
43 grid[i].alpha = (asin(grid[i].n_avg) - grid[i].beta) / t; \
45 grid[i].beta = asin(grid[i].n_avg) - grid[i].alpha * t; \
48 static void handle_xis(void)
52 grid
[0].n_avg
= (grid
[1].c_sin
+
54 grid
[g_width
+ 1].c_sin
) / 3.0;
58 grid
[g_width
- 1].n_avg
= (grid
[g_width
- 2].c_sin
+
59 grid
[2 * g_width
- 2].c_sin
+
60 grid
[2 * g_width
- 1].c_sin
) / 3.0;
64 grid
[(g_height
- 1) * g_width
].n_avg
= (grid
[(g_height
- 2) * g_width
].c_sin
+
65 grid
[(g_height
- 2) * g_width
+ 1].c_sin
+
66 grid
[(g_height
- 1) * g_width
+ 1].c_sin
) / 3.0;
67 SET_XI((g_height
- 1) * g_width
);
68 ADJUST((g_height
- 1) * g_width
);
70 grid
[g_height
* g_width
- 1].n_avg
= (grid
[g_height
* g_width
- 2].c_sin
+
71 grid
[(g_height
- 1) * g_width
- 2].c_sin
+
72 grid
[(g_height
- 1) * g_width
- 1].c_sin
) / 3.0;
73 SET_XI(g_height
* g_width
- 1);
74 ADJUST(g_height
* g_width
- 1);
76 for (i
= 1; i
< g_width
- 1; ++i
) {
77 grid
[i
].n_avg
= (grid
[i
- 1].c_sin
+
79 grid
[g_width
+ i
- 1].c_sin
+
80 grid
[g_width
+ i
].c_sin
+
81 grid
[g_width
+ i
+ 1].c_sin
) / 5.0;
86 for (i
= (g_height
- 1) * g_width
+ 1; i
< g_height
* g_width
- 2; ++i
) {
87 grid
[i
].n_avg
= (grid
[i
- 1].c_sin
+
89 grid
[i
- g_width
- 1].c_sin
+
90 grid
[i
- g_width
].c_sin
+
91 grid
[i
- g_width
+ 1].c_sin
) / 5.0;
96 for (j
= g_width
; j
< g_height
* g_width
; j
+= g_width
) {
97 grid
[j
].n_avg
= (grid
[j
- g_width
].c_sin
+
98 grid
[j
- g_width
+ 1].c_sin
+
100 grid
[j
+ g_width
].c_sin
+
101 grid
[j
+ g_width
+ 1].c_sin
) / 5.0;
106 for (j
= 2 * g_width
- 1; j
< g_height
* g_width
- 1; j
+= g_width
) {
107 grid
[j
].n_avg
= (grid
[j
- g_width
].c_sin
+
108 grid
[j
- g_width
- 1].c_sin
+
110 grid
[j
+ g_width
].c_sin
+
111 grid
[j
+ g_width
- 1].c_sin
) / 5.0;
116 for (j
= 1; j
< g_height
- 1; ++j
) {
117 for (i
= 1; i
< g_width
- 1; ++i
) {
118 grid
[j
* g_width
+ i
].n_avg
= (grid
[(j
- 1) * g_width
+ (i
- 1)].c_sin
+
119 grid
[(j
- 1) * g_width
+ (i
+ 0)].c_sin
+
120 grid
[(j
- 1) * g_width
+ (i
+ 1)].c_sin
+
121 grid
[(j
+ 0) * g_width
+ (i
- 1)].c_sin
+
122 grid
[(j
+ 0) * g_width
+ (i
+ 1)].c_sin
+
123 grid
[(j
+ 1) * g_width
+ (i
- 1)].c_sin
+
124 grid
[(j
+ 1) * g_width
+ (i
+ 0)].c_sin
+
125 grid
[(j
+ 1) * g_width
+ (i
+ 1)].c_sin
) / 8.0;
126 SET_XI(j
* g_width
+ i
);
127 ADJUST(j
* g_width
+ i
);
132 int con_initialize_f(FILE * ifp
)
134 int i_width
, i_height
;
138 if (fscanf(ifp
, " %d x %d ", &i_width
, &i_height
) != 2)
139 return E_MALFORMED_INPUT
;
141 if (i_width
<= 0 || i_height
<= 0)
142 return E_MALFORMED_INPUT
;
146 g_len
= (size_t)g_width
* (size_t)g_height
;
147 grid
= calloc(g_len
, sizeof(*grid
));
149 for (j
= 0; j
< g_height
; ++j
) {
150 for (i
= 0; i
< g_width
; ++i
) {
151 if (fscanf(ifp
, " %lf , %lf ", &a
, &b
) != 2)
152 return E_MALFORMED_INPUT
;
164 int con_initialize_wh(int width
, int height
)
166 if (width
<= 0 || height
<= 0)
167 return E_MALFORMED_INPUT
;
171 g_len
= (size_t)g_width
* (size_t)g_height
;
172 grid
= calloc(g_len
, sizeof(*grid
));
196 static const char *APEX
= "^";
197 static const char *HIGH
= "'";
198 static const char *NIL
= " ";
199 static const char *LOW
= ",";
200 static const char *NADIR
= "v";
202 int con_rep_at(int x
, int y
, const char ** const rep
)
206 if (x
< 0 || y
< 0 || x
>= g_width
|| y
>= g_height
)
207 return E_ILLEGAL_COORDINATES
;
209 d
= grid
[y
* g_width
+ x
].c_sin
;
225 static const char *titles
[] = {"Alpha:", "Beta:"};
226 int con_input_titles(int * const n
, const char * const ** const o_titles
)
234 int con_set_val(int x
, int y
, const char ** vals
)
238 if (x
< 0 || y
< 0 || x
>= g_width
|| y
>= g_height
|| !vals
|| !vals
[0] ||
240 return E_ILLEGAL_COORDINATES
;
242 if (sscanf(vals
[0], " %lf ", &a
) != 1 || sscanf(vals
[1], " %lf ", &b
) != 1 )
245 grid
[y
* g_width
+ g_height
].alpha
= a
;
246 grid
[y
* g_width
+ g_height
].beta
= b
;
251 int con_teardown(void)
259 const char *con_errstring(int errno
)
262 case 0: return "No error";
263 case E_UNIMPLEMENTED
: return "Unimplemented function";
264 case E_UNINITIALIZED
: return "Uninitialized";
265 case E_ILLEGAL_COORDINATES
: return "Illegal coordinates";
266 case E_NULLREP
: return "Null pointer passed";
267 case E_MALFORMED_INPUT
: return "Malformed input file";
268 case E_BAD_VALUES
: return "Non-double values";
269 default: return "Unknown error";