Skip to content

Commit

Permalink
r.geomorphon: Use NUM_DIRS instead of hard-coding
Browse files Browse the repository at this point in the history
  • Loading branch information
infrastation authored and wenzeslaus committed Oct 28, 2020
1 parent 03029a7 commit 0a7046c
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 37 deletions.
54 changes: 27 additions & 27 deletions raster/r.geomorphon/geom.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "local_proto.h"
/* static double dirs[8] = { 0.7854, 0., 5.4978, 4.7124, 3.9270, 3.1416, 2.3562, 1.5708 };*/ /* radians */
static double sins[8] = { 0.7071067812, 0, -0.7071067812, -1, -0.7071067812, 0, 0.7071067812, 1 }; /* sinus */
static double coss[8] = { 0.7071067812, 1, 0.7071067812, 0, -0.7071067812, -1, -0.7071067812, 0 }; /* cosinus */
/* static double dirs[NUM_DIRS] = { 0.7854, 0., 5.4978, 4.7124, 3.9270, 3.1416, 2.3562, 1.5708 };*/ /* radians */
static double sins[NUM_DIRS] = { 0.7071067812, 0, -0.7071067812, -1, -0.7071067812, 0, 0.7071067812, 1 }; /* sinus */
static double coss[NUM_DIRS] = { 0.7071067812, 1, 0.7071067812, 0, -0.7071067812, -1, -0.7071067812, 0 }; /* cosinus */

/* DIRS in DEGREES from NORTH: 45,0,315,270,225,180,135,90 */

Expand All @@ -12,26 +12,26 @@ unsigned int ternary_rotate(unsigned int value)
* function is used to create lookup table with original
* terrain patterns (6561) and its rotated and mirrored counterparts (498)*/

unsigned char pattern[8];
unsigned char rev_pattern[8];
unsigned char tmp_pattern[8];
unsigned char tmp_rev_pattern[8];
unsigned char pattern[NUM_DIRS];
unsigned char rev_pattern[NUM_DIRS];
unsigned char tmp_pattern[NUM_DIRS];
unsigned char tmp_rev_pattern[NUM_DIRS];
unsigned int code = 10000, tmp_code, rev_code = 10000, tmp_rev_code;
int power = 1;
int i, j, k;

for (i = 0; i < 8; i++) {
for (i = 0; i < NUM_DIRS; i++) {
pattern[i] = value % 3;
rev_pattern[7 - i] = value % 3;
value /= 3;
}

for (j = 0; j < 8; j++) {
for (j = 0; j < NUM_DIRS; j++) {
power = 1;
tmp_code = 0;
tmp_rev_code = 0;
for (i = 0; i < 8; i++) {
k = (i - j) < 0 ? j - 8 : j;
for (i = 0; i < NUM_DIRS; i++) {
k = (i - j) < 0 ? j - NUM_DIRS : j;
tmp_pattern[i] = pattern[i - k];
tmp_rev_pattern[i] = rev_pattern[i - k];
tmp_code += tmp_pattern[i] * power;
Expand Down Expand Up @@ -85,14 +85,14 @@ int determine_binary(int *pattern, int sign)
int n, i;
unsigned char binary = 0, result = 255, test = 0;

for (i = 0, n = 1; i < 8; i++, n *= 2)
for (i = 0, n = 1; i < NUM_DIRS; i++, n *= 2)
binary += (pattern[i] == sign) ? n : 0;
/* rotate */
for (i = 0; i < 8; ++i) {
for (i = 0; i < NUM_DIRS; ++i) {
if ((i &= 7) == 0)
test = binary;
else
test = (binary << i) | (binary >> (8 - i));
test = (binary << i) | (binary >> (NUM_DIRS - i));
result = (result < test) ? result : test;
}
return (int)result;
Expand All @@ -105,11 +105,11 @@ int rotate(unsigned char binary)
unsigned char result = 255, test = 0;

/* rotate */
for (i = 0; i < 8; ++i) {
for (i = 0; i < NUM_DIRS; ++i) {
if ((i &= 7) == 0)
test = binary;
else
test = (binary << i) | (binary >> (8 - i));
test = (binary << i) | (binary >> (NUM_DIRS - i));
result = (result < test) ? result : test;
}
return (int)result;
Expand All @@ -121,7 +121,7 @@ int determine_ternary(int *pattern)
unsigned ternary_code = 0;
int power, i;

for (i = 0, power = 1; i < 8; ++i, power *= 3)
for (i = 0, power = 1; i < NUM_DIRS; ++i, power *= 3)
ternary_code += (pattern[i] + 1) * power;
return global_ternary_codes[ternary_code];
}
Expand All @@ -132,7 +132,7 @@ float intensity(float *elevation, int pattern_size)
float sum_elevation = 0.;
int i;

for (i = 0; i < 8; i++)
for (i = 0; i < NUM_DIRS; i++)
sum_elevation -= elevation[i];

return sum_elevation / (float)pattern_size;
Expand All @@ -144,7 +144,7 @@ float exposition(float *elevation)
float max = 0.;
int i;

for (i = 0; i < 8; i++)
for (i = 0; i < NUM_DIRS; i++)
max = fabs(elevation[i]) > fabs(max) ? elevation[i] : max;
return -max;
}
Expand All @@ -155,7 +155,7 @@ float range(float *elevation)
float max = -90000000000., min = 9000000000000.; /* should be enough */
int i;

for (i = 0; i < 8; i++) {
for (i = 0; i < NUM_DIRS; i++) {
max = elevation[i] > max ? elevation[i] : max;
min = elevation[i] < min ? elevation[i] : min;
}
Expand All @@ -170,10 +170,10 @@ float variance(float *elevation, int pattern_size)
float variance = 0;
int i;

for (i = 0; i < 8; i++)
for (i = 0; i < NUM_DIRS; i++)
sum_elevation += elevation[i];
sum_elevation /= (float)pattern_size;
for (i = 0; i < 8; i++)
for (i = 0; i < NUM_DIRS; i++)
variance +=
((sum_elevation - elevation[i]) * (sum_elevation - elevation[i]));

Expand All @@ -187,7 +187,7 @@ int radial2cartesian(PATTERN * pattern)
* with the beginning in the central cell of geomorphon */
int i;

for (i = 0; i < 8; ++i)
for (i = 0; i < NUM_DIRS; ++i)
if (pattern->distance > 0) {
pattern->x[i] = pattern->distance[i] * sins[i];
pattern->y[i] = pattern->distance[i] * coss[i];
Expand All @@ -204,8 +204,8 @@ float extends(PATTERN * pattern, int pattern_size)
int i, j;
float area = 0;

for (i = 0, j = 1; i < 8; ++i, ++j) {
j = j < 8 ? j : 0;
for (i = 0, j = 1; i < NUM_DIRS; ++i, ++j) {
j = j < NUM_DIRS ? j : 0;
area +=
(pattern->x[i] * pattern->y[j] - pattern->x[j] * pattern->y[i]);
}
Expand All @@ -225,7 +225,7 @@ int shape(PATTERN * pattern, int pattern_size, float *azimuth,
double result;
double rxmin, rxmax, rymin, rymax;

for (i = 0; i < 8; ++i) {
for (i = 0; i < NUM_DIRS; ++i) {
avg_y += pattern->y[i];
avg_x += pattern->x[i];
avg_x_square += pattern->x[i] * pattern->x[i];
Expand All @@ -244,7 +244,7 @@ int shape(PATTERN * pattern, int pattern_size, float *azimuth,
cosine = cos(result);
rxmin = rxmax = pattern->x[0] * cosine - pattern->y[0] * sine;
rymin = rymax = pattern->x[0] * sine + pattern->y[0] * cosine;
for (i = 1; i < 8; ++i) {
for (i = 1; i < NUM_DIRS; ++i) {
rx = pattern->x[i] * cosine - pattern->y[i] * sine;
ry = pattern->x[i] * sine + pattern->y[i] * cosine;
rxmin = rx < rxmin ? rx : rxmin;
Expand Down
11 changes: 7 additions & 4 deletions raster/r.geomorphon/local_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))

/* Number of cardinal directions. */
#define NUM_DIRS 8

typedef char *STRING;

typedef struct
Expand Down Expand Up @@ -87,10 +90,10 @@ typedef struct
int num_negatives;
unsigned char positives;
unsigned char negatives;
int pattern[8];
float elevation[8];
double distance[8];
double x[8], y[8]; /* cartesian coordinates of geomorphon */
int pattern[NUM_DIRS];
float elevation[NUM_DIRS];
double distance[NUM_DIRS];
double x[NUM_DIRS], y[NUM_DIRS]; /* cartesian coordinates of geomorphon */
} PATTERN;

typedef enum
Expand Down
6 changes: 3 additions & 3 deletions raster/r.geomorphon/multires.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ int pattern_matching(int *pattern)
unsigned char source = 32;
int sign = -1;

for (i = 0, n = 1; i < 8; i++, n *= 2)
for (i = 0, n = 1; i < NUM_DIRS; i++, n *= 2)
binary += (pattern[i] == sign) ? n : 0;
/* rotate */
for (i = 0; i < 8; ++i) {
for (i = 0; i < NUM_DIRS; ++i) {
if ((i &= 7) == 0)
test = binary;
else
test = (binary << i) | (binary >> (8 - i));
test = (binary << i) | (binary >> (NUM_DIRS - i));
result = (result < test) ? result : test;
}
return ((result & source) == source) ? 1 : 0;
Expand Down
6 changes: 3 additions & 3 deletions raster/r.geomorphon/pattern.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
* 3|2|1
* 4|0|8
* 5|6|7 */
static int nextr[8] = { -1, -1, -1, 0, 1, 1, 1, 0 };
static int nextc[8] = { 1, 0, -1, -1, -1, 0, 1, 1 };
static int nextr[NUM_DIRS] = { -1, -1, -1, 0, 1, 1, 1, 0 };
static int nextc[NUM_DIRS] = { 1, 0, -1, -1, -1, 0, 1, 1 };

int calc_pattern(PATTERN * pattern, int row, int cur_row, int col)
{
Expand All @@ -27,7 +27,7 @@ int calc_pattern(PATTERN * pattern, int row, int cur_row, int col)
pattern->positives = 0;
pattern->negatives = 0;

for (i = 0; i < 8; ++i) {
for (i = 0; i < NUM_DIRS; ++i) {
/* reset patterns */
pattern->pattern[i] = 0;
pattern->elevation[i] = 0.;
Expand Down

0 comments on commit 0a7046c

Please sign in to comment.