12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #include <grass/raster.h>
- #include "filter.h"
- /**************************************************************
- * apply_filter: apply the filter to a single neighborhood
- *
- * filter: filter to be applied
- * input: input buffers
- **************************************************************/
- DCELL apply_filter(FILTER * filter, DCELL ** input)
- {
- int size = filter->size;
- double **matrix = filter->matrix;
- double divisor = filter->divisor;
- int r, c;
- DCELL v;
- v = 0;
- if (divisor == 0) {
- int have_result = 0;
- for (r = 0; r < size; r++)
- for (c = 0; c < size; c++) {
- if (Rast_is_d_null_value(&input[r][c]))
- continue;
- v += input[r][c] * matrix[r][c];
- divisor += filter->dmatrix[r][c];
- have_result = 1;
- }
- if (have_result)
- v /= divisor;
- else
- Rast_set_d_null_value(&v, 1);
- }
- else {
- for (r = 0; r < size; r++)
- for (c = 0; c < size; c++) {
- if (Rast_is_d_null_value(&input[r][c])) {
- Rast_set_d_null_value(&v, 1);
- return v;
- }
- v += input[r][c] * matrix[r][c];
- }
- v /= divisor;
- }
- return v;
- }
|