|
@@ -1,11 +1,11 @@
|
|
|
#include "local_proto.h"
|
|
|
/* 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 */
|
|
|
+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 */
|
|
|
|
|
|
-#define TERNARY_MAX 6561 /* 3**8 */
|
|
|
+#define TERNARY_MAX 6561 /* 3**8 */
|
|
|
static unsigned int global_ternary_codes[TERNARY_MAX];
|
|
|
|
|
|
void generate_ternary_codes()
|
|
@@ -13,7 +13,7 @@ void generate_ternary_codes()
|
|
|
unsigned i;
|
|
|
|
|
|
for (i = 0; i < TERNARY_MAX; ++i)
|
|
|
- global_ternary_codes[i] = ternary_rotate(i);
|
|
|
+ global_ternary_codes[i] = ternary_rotate(i);
|
|
|
}
|
|
|
|
|
|
unsigned int ternary_rotate(unsigned int value)
|
|
@@ -32,25 +32,25 @@ unsigned int ternary_rotate(unsigned int value)
|
|
|
int i, j, k;
|
|
|
|
|
|
for (i = 0; i < NUM_DIRS; i++) {
|
|
|
- pattern[i] = value % 3;
|
|
|
- rev_pattern[7 - i] = value % 3;
|
|
|
- value /= 3;
|
|
|
+ pattern[i] = value % 3;
|
|
|
+ rev_pattern[7 - i] = value % 3;
|
|
|
+ value /= 3;
|
|
|
}
|
|
|
|
|
|
for (j = 0; j < NUM_DIRS; j++) {
|
|
|
- power = 1;
|
|
|
- tmp_code = 0;
|
|
|
- tmp_rev_code = 0;
|
|
|
- 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;
|
|
|
- tmp_rev_code += tmp_rev_pattern[i] * power;
|
|
|
- power *= 3;
|
|
|
- }
|
|
|
- code = MIN(tmp_code, code);
|
|
|
- rev_code = MIN(tmp_rev_code, rev_code);
|
|
|
+ power = 1;
|
|
|
+ tmp_code = 0;
|
|
|
+ tmp_rev_code = 0;
|
|
|
+ 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;
|
|
|
+ tmp_rev_code += tmp_rev_pattern[i] * power;
|
|
|
+ power *= 3;
|
|
|
+ }
|
|
|
+ code = MIN(tmp_code, code);
|
|
|
+ rev_code = MIN(tmp_rev_code, rev_code);
|
|
|
}
|
|
|
return MIN(code, rev_code);
|
|
|
}
|
|
@@ -61,17 +61,17 @@ FORMS determine_form(int num_minus, int num_plus)
|
|
|
* simple approach to determine form pattern */
|
|
|
|
|
|
const FORMS forms[9][9] = {
|
|
|
- /* minus ------------- plus ---------------- */
|
|
|
- /* 0 1 2 3 4 5 6 7 8 */
|
|
|
- /* 0 */ {FL, FL, FL, FS, FS, VL, VL, VL, PT},
|
|
|
- /* 1 */ {FL, FL, FS, FS, FS, VL, VL, VL, __},
|
|
|
- /* 2 */ {FL, SH, SL, SL, HL, HL, VL, __, __},
|
|
|
- /* 3 */ {SH, SH, SL, SL, SL, HL, __, __, __},
|
|
|
- /* 4 */ {SH, SH, SP, SL, SL, __, __, __, __},
|
|
|
- /* 5 */ {RI, RI, SP, SP, __, __, __, __, __},
|
|
|
- /* 6 */ {RI, RI, RI, __, __, __, __, __, __},
|
|
|
- /* 7 */ {RI, RI, __, __, __, __, __, __, __},
|
|
|
- /* 8 */ {PK, __, __, __, __, __, __, __, __},
|
|
|
+ /* minus ------------- plus ---------------- */
|
|
|
+ /* 0 1 2 3 4 5 6 7 8 */
|
|
|
+ /* 0 */ {FL, FL, FL, FS, FS, VL, VL, VL, PT},
|
|
|
+ /* 1 */ {FL, FL, FS, FS, FS, VL, VL, VL, __},
|
|
|
+ /* 2 */ {FL, SH, SL, SL, HL, HL, VL, __, __},
|
|
|
+ /* 3 */ {SH, SH, SL, SL, SL, HL, __, __, __},
|
|
|
+ /* 4 */ {SH, SH, SP, SL, SL, __, __, __, __},
|
|
|
+ /* 5 */ {RI, RI, SP, SP, __, __, __, __, __},
|
|
|
+ /* 6 */ {RI, RI, RI, __, __, __, __, __, __},
|
|
|
+ /* 7 */ {RI, RI, __, __, __, __, __, __, __},
|
|
|
+ /* 8 */ {PK, __, __, __, __, __, __, __, __},
|
|
|
};
|
|
|
/* (See the FORMS enum for the legend.) */
|
|
|
|
|
@@ -85,14 +85,14 @@ int determine_binary(int *pattern, int sign)
|
|
|
unsigned char binary = 0, result = 255, test = 0;
|
|
|
|
|
|
for (i = 0, n = 1; i < NUM_DIRS; i++, n *= 2)
|
|
|
- binary += (pattern[i] == sign) ? n : 0;
|
|
|
+ binary += (pattern[i] == sign) ? n : 0;
|
|
|
/* rotate */
|
|
|
for (i = 0; i < NUM_DIRS; ++i) {
|
|
|
- if ((i &= 7) == 0)
|
|
|
- test = binary;
|
|
|
- else
|
|
|
- test = (binary << i) | (binary >> (NUM_DIRS - i));
|
|
|
- result = MIN(result, test);
|
|
|
+ if ((i &= 7) == 0)
|
|
|
+ test = binary;
|
|
|
+ else
|
|
|
+ test = (binary << i) | (binary >> (NUM_DIRS - i));
|
|
|
+ result = MIN(result, test);
|
|
|
}
|
|
|
return (int)result;
|
|
|
}
|
|
@@ -105,11 +105,11 @@ int rotate(unsigned char binary)
|
|
|
|
|
|
/* rotate */
|
|
|
for (i = 0; i < NUM_DIRS; ++i) {
|
|
|
- if ((i &= 7) == 0)
|
|
|
- test = binary;
|
|
|
- else
|
|
|
- test = (binary << i) | (binary >> (NUM_DIRS - i));
|
|
|
- result = MIN(result, test);
|
|
|
+ if ((i &= 7) == 0)
|
|
|
+ test = binary;
|
|
|
+ else
|
|
|
+ test = (binary << i) | (binary >> (NUM_DIRS - i));
|
|
|
+ result = MIN(result, test);
|
|
|
}
|
|
|
return (int)result;
|
|
|
}
|
|
@@ -121,7 +121,7 @@ int determine_ternary(int *pattern)
|
|
|
int power, i;
|
|
|
|
|
|
for (i = 0, power = 1; i < NUM_DIRS; ++i, power *= 3)
|
|
|
- ternary_code += (pattern[i] + 1) * power;
|
|
|
+ ternary_code += (pattern[i] + 1) * power;
|
|
|
return global_ternary_codes[ternary_code];
|
|
|
}
|
|
|
|
|
@@ -132,7 +132,7 @@ float intensity(float *elevation, int pattern_size)
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < NUM_DIRS; i++)
|
|
|
- sum_elevation -= elevation[i];
|
|
|
+ sum_elevation -= elevation[i];
|
|
|
|
|
|
return sum_elevation / (float)pattern_size;
|
|
|
}
|
|
@@ -145,8 +145,8 @@ float exposition(float *elevation)
|
|
|
|
|
|
max = elevation[0];
|
|
|
for (i = 1; i < NUM_DIRS; i++)
|
|
|
- if (fabs(elevation[i]) > fabs(max))
|
|
|
- max = elevation[i];
|
|
|
+ if (fabs(elevation[i]) > fabs(max))
|
|
|
+ max = elevation[i];
|
|
|
return -max;
|
|
|
}
|
|
|
|
|
@@ -158,8 +158,8 @@ float range(float *elevation)
|
|
|
|
|
|
max = min = elevation[0];
|
|
|
for (i = 1; i < NUM_DIRS; i++) {
|
|
|
- max = MAX(elevation[i], max);
|
|
|
- min = MIN(elevation[i], min);
|
|
|
+ max = MAX(elevation[i], max);
|
|
|
+ min = MIN(elevation[i], min);
|
|
|
}
|
|
|
|
|
|
return max - min;
|
|
@@ -173,11 +173,11 @@ float variance(float *elevation, int pattern_size)
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < NUM_DIRS; i++)
|
|
|
- sum_elevation += elevation[i];
|
|
|
+ sum_elevation += elevation[i];
|
|
|
sum_elevation /= (float)pattern_size;
|
|
|
for (i = 0; i < NUM_DIRS; i++)
|
|
|
- variance +=
|
|
|
- ((sum_elevation - elevation[i]) * (sum_elevation - elevation[i]));
|
|
|
+ variance +=
|
|
|
+ ((sum_elevation - elevation[i]) * (sum_elevation - elevation[i]));
|
|
|
|
|
|
return variance / (float)pattern_size;
|
|
|
}
|
|
@@ -190,14 +190,14 @@ int radial2cartesian(PATTERN * pattern)
|
|
|
int 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];
|
|
|
- }
|
|
|
- else {
|
|
|
- pattern->x[i] = 0;
|
|
|
- pattern->y[i] = 0;
|
|
|
- }
|
|
|
+ if (pattern->distance > 0) {
|
|
|
+ pattern->x[i] = pattern->distance[i] * sins[i];
|
|
|
+ pattern->y[i] = pattern->distance[i] * coss[i];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ pattern->x[i] = 0;
|
|
|
+ pattern->y[i] = 0;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -207,15 +207,15 @@ float extends(PATTERN * pattern)
|
|
|
float area = 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]);
|
|
|
+ j = j < NUM_DIRS ? j : 0;
|
|
|
+ area +=
|
|
|
+ (pattern->x[i] * pattern->y[j] - pattern->x[j] * pattern->y[i]);
|
|
|
}
|
|
|
return fabs(area) / 2.;
|
|
|
}
|
|
|
|
|
|
int shape(PATTERN * pattern, int pattern_size, float *azimuth,
|
|
|
- float *elongation, float *width)
|
|
|
+ float *elongation, float *width)
|
|
|
{
|
|
|
/* calculates azimuth, elongation and width of geomorphon's polygon */
|
|
|
int i;
|
|
@@ -228,10 +228,10 @@ int shape(PATTERN * pattern, int pattern_size, float *azimuth,
|
|
|
double rxmin, rxmax, rymin, rymax;
|
|
|
|
|
|
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];
|
|
|
- avg_x_y += pattern->x[i] * pattern->y[i];
|
|
|
+ avg_y += pattern->y[i];
|
|
|
+ avg_x += pattern->x[i];
|
|
|
+ avg_x_square += pattern->x[i] * pattern->x[i];
|
|
|
+ avg_x_y += pattern->x[i] * pattern->y[i];
|
|
|
}
|
|
|
avg_y /= (float)pattern_size;
|
|
|
avg_x /= (float)pattern_size;
|
|
@@ -247,12 +247,12 @@ int shape(PATTERN * pattern, int pattern_size, float *azimuth,
|
|
|
rxmin = rxmax = pattern->x[0] * cosine - pattern->y[0] * sine;
|
|
|
rymin = rymax = pattern->x[0] * sine + pattern->y[0] * cosine;
|
|
|
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 = MIN(rx, rxmin);
|
|
|
- rxmax = MAX(rx, rxmax);
|
|
|
- rymin = MIN(ry, rymin);
|
|
|
- rymax = MAX(ry, rymax);
|
|
|
+ rx = pattern->x[i] * cosine - pattern->y[i] * sine;
|
|
|
+ ry = pattern->x[i] * sine + pattern->y[i] * cosine;
|
|
|
+ rxmin = MIN(rx, rxmin);
|
|
|
+ rxmax = MAX(rx, rxmax);
|
|
|
+ rymin = MIN(ry, rymin);
|
|
|
+ rymax = MAX(ry, rymax);
|
|
|
}
|
|
|
rx = (rxmax - rxmin);
|
|
|
ry = (rymax - rymin);
|