1 #include <stdio.h>
2 #include <grass/gis.h>
3
4 #define POLYGON_DIMENSION 20
5 /* From FAOSOIL CD, after USDA 1951, p209 */
6
7 struct vector
8 {
9 double sand;
10 double clay;
11 double silt;
12 };
13
point_in_triangle(double point_x,double point_y,double point_z,double t1_x,double t1_y,double t1_z,double t2_x,double t2_y,double t2_z,double t3_x,double t3_y,double t3_z)14 double point_in_triangle(double point_x, double point_y, double point_z,
15 double t1_x, double t1_y, double t1_z, double t2_x,
16 double t2_y, double t2_z, double t3_x, double t3_y,
17 double t3_z)
18 {
19 G_debug(1,"point_in_triangle: sand=%5.3f clay=%5.3f silt=%5.3f",
20 point_x,point_y,point_z);
21 double answer;
22 double answer1_x, answer1_y, answer1_z;
23 double answer2_x, answer2_y, answer2_z;
24 double answer3_x, answer3_y, answer3_z;
25
26 /* Consider three points forming a trinagle from a given soil class boundary ABC */
27 /* Consider F an additional point in space */
28 double af1, af2, af3; /*Points for vector AF */
29 double bf1, bf2, bf3; /*Points for vector BF */
30 double cf1, cf2, cf3; /*Points for vector CF */
31 double ab1, ab2, ab3; /*Points for vector AB */
32 double bc1, bc2, bc3; /*Points for vector BC */
33 double ca1, ca2, ca3; /*Points for vector CA */
34
35 /* Create vectors AB, BC and CA */
36 ab1 = (t2_x - t1_x);
37 ab2 = (t2_y - t1_y);
38 ab3 = (t2_z - t1_z);
39 bc1 = (t3_x - t2_x);
40 bc2 = (t3_y - t2_y);
41 bc3 = (t3_z - t2_z);
42 ca1 = (t1_x - t3_x);
43 ca2 = (t1_y - t3_y);
44 ca3 = (t1_z - t3_z);
45 /* Create vectors AF, BF and CF */
46 af1 = (point_x - t1_x);
47 af2 = (point_y - t1_y);
48 af3 = (point_z - t1_z);
49 bf1 = (point_x - t2_x);
50 bf2 = (point_y - t2_y);
51 bf3 = (point_z - t2_z);
52 cf1 = (point_x - t3_x);
53 cf2 = (point_y - t3_y);
54 cf3 = (point_z - t3_z);
55 /* Calculate the following CrossProducts: */
56 /* AFxAB */
57 answer1_x = (af2 * ab3) - (af3 * ab2);
58 answer1_y = (af3 * ab1) - (af1 * ab3);
59 answer1_z = (af1 * ab2) - (af2 * ab1);
60 /* G_message("answer(AFxAB)= %f %f %f",answer1_x, answer1_y, answer1_z); */
61 /*BFxBC */
62 answer2_x = (bf2 * bc3) - (bf3 * bc2);
63 answer2_y = (bf3 * bc1) - (bf1 * bc3);
64 answer2_z = (bf1 * bc2) - (bf2 * bc1);
65 /* G_message("answer(BFxBC)= %f %f %f",answer2_x, answer2_y, answer2_z); */
66 /*CFxCA */
67 answer3_x = (cf2 * ca3) - (cf3 * ca2);
68 answer3_y = (cf3 * ca1) - (cf1 * ca3);
69 answer3_z = (cf1 * ca2) - (cf2 * ca1);
70 /* G_message("answer(CFxCA)= %f %f %f",answer3_x, answer3_y, answer3_z); */
71 answer = 0.0; /*initialize value */
72 if ((int)answer1_x >= 0 && (int)answer2_x >= 0 && (int)answer3_x >= 0) {
73 answer += 1.0;
74 }
75 else if ((int)answer1_x <= 0 && (int)answer2_x <= 0 &&
76 (int)answer3_x <= 0) {
77 answer -= 1.0;
78 }
79 if ((int)answer1_y >= 0 && (int)answer2_y >= 0 && (int)answer3_y >= 0) {
80 answer += 1.0;
81 }
82 else if ((int)answer1_y <= 0 && (int)answer2_y <= 0 &&
83 (int)answer3_y <= 0) {
84 answer -= 1.0;
85 }
86 if ((int)answer1_z >= 0 && (int)answer2_z >= 0 && (int)answer3_z >= 0) {
87 answer += 1.0;
88 }
89 else if ((int)answer1_z <= 0 && (int)answer2_z <= 0 &&
90 (int)answer3_z <= 0) {
91 answer -= 1.0;
92 }
93 if (answer == 3 || answer == -3) {
94 answer = 1;
95 }
96 else {
97 answer = 0;
98 }
99 return answer;
100 }
101
prct2tex(double sand_input,double clay_input,double silt_input)102 int prct2tex(double sand_input, double clay_input, double silt_input)
103 {
104 G_debug(1,"%5.3f||%5.3f||%5.3f",sand_input,clay_input,silt_input);
105
106 /* set up index for soil texture classes */
107 int index = 20;
108
109 /* set up mark index for inside/outside polygon check */
110 double mark[POLYGON_DIMENSION] = { 0.0 };
111 /*G_message("in prct2tex()"); */
112 /*setup the 3Dvectors and initialize them */
113 /* index 0 */
114 struct vector cls_clay[POLYGON_DIMENSION] = { { 0.0 } };
115 /* index 1 */
116 struct vector cls_sandy_clay[POLYGON_DIMENSION] = { { 0.0 } };
117 /* index 2 */
118 struct vector cls_silty_clay[POLYGON_DIMENSION] = { { 0.0 } };
119 /* index 3 */
120 struct vector cls_sandy_clay_loam[POLYGON_DIMENSION] = { { 0.0 } };
121 /* index 4 */
122 struct vector cls_clay_loam[POLYGON_DIMENSION] = { { 0.0 } };
123 /* index 5 */
124 struct vector cls_silty_clay_loam[POLYGON_DIMENSION] = { { 0.0 } };
125 /* index 6 */
126 struct vector cls_sand[POLYGON_DIMENSION] = { { 0.0 } };
127 /* index 7 */
128 struct vector cls_loamy_sand[POLYGON_DIMENSION] = { { 0.0 } };
129 /* index 8 */
130 struct vector cls_sandy_loam[POLYGON_DIMENSION] = { { 0.0 } };
131 /* index 9 */
132 struct vector cls_loam[POLYGON_DIMENSION] = { { 0.0 } };
133 /* index 10 */
134 struct vector cls_silt_loam[POLYGON_DIMENSION] = { { 0.0 } };
135 /* index 11 */
136 struct vector cls_silt[POLYGON_DIMENSION] = { { 0.0 } };
137
138 if ((sand_input + clay_input + silt_input) <= 10.0) {
139 sand_input = sand_input * 100.0;
140 clay_input = clay_input * 100.0;
141 silt_input = silt_input * 100.0;
142 }
143 /*G_message("%5.3f||%5.3f||%5.3f|",sand_input,clay_input,silt_input); */
144
145 /*Feed the polygons for index 0 */
146 cls_clay[0].sand = 0.0;
147 cls_clay[0].clay = 100.0;
148 cls_clay[0].silt = 0.0;
149 cls_clay[1].sand = 0.0;
150 cls_clay[1].clay = 60.0;
151 cls_clay[1].silt = 40.0;
152 cls_clay[2].sand = 20.0;
153 cls_clay[2].clay = 40.0;
154 cls_clay[2].silt = 40.0;
155 cls_clay[3].sand = 50.0;
156 cls_clay[3].clay = 40.0;
157 cls_clay[3].silt = 10.0;
158 cls_clay[4].sand = 50.0;
159 cls_clay[4].clay = 50.0;
160 cls_clay[4].silt = 0.0;
161 /* Check for index 0 */
162 /* G_message("in prct2tex(): check for index 0"); */
163 mark[0] =
164 point_in_triangle(sand_input, clay_input, silt_input,
165 cls_clay[0].sand, cls_clay[0].clay,
166 cls_clay[0].silt, cls_clay[1].sand,
167 cls_clay[1].clay, cls_clay[1].silt,
168 cls_clay[2].sand, cls_clay[2].clay,
169 cls_clay[2].silt);
170 mark[1] =
171 point_in_triangle(sand_input, clay_input, silt_input,
172 cls_clay[0].sand, cls_clay[0].clay,
173 cls_clay[0].silt, cls_clay[2].sand,
174 cls_clay[2].clay, cls_clay[2].silt,
175 cls_clay[3].sand, cls_clay[3].clay,
176 cls_clay[3].silt);
177 mark[2] =
178 point_in_triangle(sand_input, clay_input, silt_input,
179 cls_clay[0].sand, cls_clay[0].clay,
180 cls_clay[0].silt, cls_clay[3].sand,
181 cls_clay[3].clay, cls_clay[3].silt,
182 cls_clay[4].sand, cls_clay[4].clay,
183 cls_clay[4].silt);
184 /* G_message("Clay: mark[0]=%f",mark[0]); */
185 /* G_message("Clay: mark[1]=%f",mark[1]); */
186 /* G_message("Clay: mark[2]=%f",mark[2]); */
187 if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1) {
188 index = 0;
189 /* G_message("Clay: index labelled as 0"); */
190 }
191 if (index == 20) { /* if index not found then continue */
192 /*Feed the polygons for index 1 */
193 cls_sandy_clay[0].sand = 50.0;
194 cls_sandy_clay[0].clay = 50.0;
195 cls_sandy_clay[0].silt = 0.0;
196 cls_sandy_clay[1].sand = 50.0;
197 cls_sandy_clay[1].clay = 35.0;
198 cls_sandy_clay[1].silt = 15.0;
199 cls_sandy_clay[2].sand = 65.0;
200 cls_sandy_clay[2].clay = 35.0;
201 cls_sandy_clay[2].silt = 0.0;
202 /* Check for index 1 */
203 mark[0] =
204 point_in_triangle(sand_input, clay_input, silt_input,
205 cls_sandy_clay[0].sand, cls_sandy_clay[0].clay,
206 cls_sandy_clay[0].silt, cls_sandy_clay[1].sand,
207 cls_sandy_clay[1].clay, cls_sandy_clay[1].silt,
208 cls_sandy_clay[2].sand, cls_sandy_clay[2].clay,
209 cls_sandy_clay[2].silt);
210
211 /* G_message("Sandy Clay: mark[0]=%f",mark[0]); */
212 if (mark[0] == 1) {
213 index = 1;
214 /* G_message("Sandy Clay: index labelled as 1"); */
215 }
216 }
217 if (index == 20) { /* if index not found then continue */
218 /*Feed the polygons for index 2 */
219 cls_silty_clay[0].sand = 0.0;
220 cls_silty_clay[0].clay = 60.0;
221 cls_silty_clay[0].silt = 40.0;
222 cls_silty_clay[1].sand = 0.0;
223 cls_silty_clay[1].clay = 40.0;
224 cls_silty_clay[1].silt = 60.0;
225 cls_silty_clay[2].sand = 20.0;
226 cls_silty_clay[2].clay = 40.0;
227 cls_silty_clay[2].silt = 40.0;
228 /* Check for index 2 */
229 /* G_message("sand=%5.3f||clay=%5.3f||silt=%5.3f",sand_input,
230 clay_input,silt_input); */
231 mark[0] =
232 point_in_triangle(sand_input, clay_input, silt_input,
233 cls_silty_clay[0].sand, cls_silty_clay[0].clay,
234 cls_silty_clay[0].silt, cls_silty_clay[1].sand,
235 cls_silty_clay[1].clay, cls_silty_clay[1].silt,
236 cls_silty_clay[2].sand, cls_silty_clay[2].clay,
237 cls_silty_clay[2].silt);
238
239 /* G_message("Silty Clay: mark[0]=%f",mark[0]); */
240 if (mark[0] == 1) {
241 index = 2;
242 /* G_message("Silty Clay: index labelled as 2"); */
243 }
244 }
245 if (index == 20) { /* if index not found then continue */
246 /*Feed the polygons for index 3 */
247 cls_sandy_clay_loam[0].sand = 65.0;
248 cls_sandy_clay_loam[0].clay = 35.0;
249 cls_sandy_clay_loam[0].silt = 0.0;
250 cls_sandy_clay_loam[1].sand = 50.0;
251 cls_sandy_clay_loam[1].clay = 35.0;
252 cls_sandy_clay_loam[1].silt = 15.0;
253 cls_sandy_clay_loam[2].sand = 50.0;
254 cls_sandy_clay_loam[2].clay = 30.0;
255 cls_sandy_clay_loam[2].silt = 20.0;
256 cls_sandy_clay_loam[3].sand = 55.0;
257 cls_sandy_clay_loam[3].clay = 25.0;
258 cls_sandy_clay_loam[3].silt = 20.0;
259 cls_sandy_clay_loam[4].sand = 75.0;
260 cls_sandy_clay_loam[4].clay = 25.0;
261 cls_sandy_clay_loam[4].silt = 0.0;
262 /* Check for index 0 */
263 /* G_message("in prct2tex(): check for index 3"); */
264 mark[0] =
265 point_in_triangle(sand_input, clay_input, silt_input,
266 cls_sandy_clay_loam[0].sand,
267 cls_sandy_clay_loam[0].clay,
268 cls_sandy_clay_loam[0].silt,
269 cls_sandy_clay_loam[1].sand,
270 cls_sandy_clay_loam[1].clay,
271 cls_sandy_clay_loam[1].silt,
272 cls_sandy_clay_loam[2].sand,
273 cls_sandy_clay_loam[2].clay,
274 cls_sandy_clay_loam[2].silt);
275 mark[1] =
276 point_in_triangle(sand_input, clay_input, silt_input,
277 cls_sandy_clay_loam[0].sand,
278 cls_sandy_clay_loam[0].clay,
279 cls_sandy_clay_loam[0].silt,
280 cls_sandy_clay_loam[2].sand,
281 cls_sandy_clay_loam[2].clay,
282 cls_sandy_clay_loam[2].silt,
283 cls_sandy_clay_loam[3].sand,
284 cls_sandy_clay_loam[3].clay,
285 cls_sandy_clay_loam[3].silt);
286 mark[2] =
287 point_in_triangle(sand_input, clay_input, silt_input,
288 cls_sandy_clay_loam[0].sand,
289 cls_sandy_clay_loam[0].clay,
290 cls_sandy_clay_loam[0].silt,
291 cls_sandy_clay_loam[3].sand,
292 cls_sandy_clay_loam[3].clay,
293 cls_sandy_clay_loam[3].silt,
294 cls_sandy_clay_loam[4].sand,
295 cls_sandy_clay_loam[4].clay,
296 cls_sandy_clay_loam[4].silt);
297 /* G_message("Sandy Clay Loam: mark[0]=%f",mark[0]); */
298 /* G_message("Sandy Clay Loam: mark[1]=%f",mark[1]); */
299 /* G_message("Sandy Clay Loam: mark[2]=%f",mark[2]); */
300 if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1) {
301 index = 3;
302 /* G_message("Sandy Clay Loam: index labelled as 3"); */
303 }
304 }
305 if (index == 20) { /* if index not found then continue */
306 /*Feed the polygons for index 4 */
307 cls_clay_loam[0].sand = 20.0;
308 cls_clay_loam[0].clay = 40.0;
309 cls_clay_loam[0].silt = 40.0;
310 cls_clay_loam[1].sand = 20.0;
311 cls_clay_loam[1].clay = 30.0;
312 cls_clay_loam[1].silt = 50.0;
313 cls_clay_loam[2].sand = 50.0;
314 cls_clay_loam[2].clay = 30.0;
315 cls_clay_loam[2].silt = 20.0;
316 cls_clay_loam[3].sand = 10.0;
317 cls_clay_loam[3].clay = 50.0;
318 cls_clay_loam[3].silt = 40.0;
319 /* Check for index 4 */
320 /* G_message("in prct2tex(): check for index 4"); */
321 mark[0] =
322 point_in_triangle(sand_input, clay_input, silt_input,
323 cls_clay_loam[0].sand, cls_clay_loam[0].clay,
324 cls_clay_loam[0].silt, cls_clay_loam[1].sand,
325 cls_clay_loam[1].clay, cls_clay_loam[1].silt,
326 cls_clay_loam[2].sand, cls_clay_loam[2].clay,
327 cls_clay_loam[2].silt);
328 mark[1] =
329 point_in_triangle(sand_input, clay_input, silt_input,
330 cls_clay_loam[0].sand, cls_clay_loam[0].clay,
331 cls_clay_loam[0].silt, cls_clay_loam[2].sand,
332 cls_clay_loam[2].clay, cls_clay_loam[2].silt,
333 cls_clay_loam[3].sand, cls_clay_loam[3].clay,
334 cls_clay_loam[3].silt);
335 /* G_message("Clay Loam: mark[0]=%f",mark[0]); */
336 /* G_message("Clay Loam: mark[1]=%f",mark[1]); */
337 if (mark[0] == 1 || mark[1] == 1) {
338 index = 4;
339 /* G_message("Clay Loam: index labelled as 4"); */
340 }
341 }
342 if (index == 20) { /* if index not found then continue */
343 /*Feed the polygons for index 5 */
344 cls_silty_clay_loam[0].sand = 0.0;
345 cls_silty_clay_loam[0].clay = 40.0;
346 cls_silty_clay_loam[0].silt = 60.0;
347 cls_silty_clay_loam[1].sand = 0.0;
348 cls_silty_clay_loam[1].clay = 30.0;
349 cls_silty_clay_loam[1].silt = 70.0;
350 cls_silty_clay_loam[2].sand = 20.0;
351 cls_silty_clay_loam[2].clay = 30.0;
352 cls_silty_clay_loam[2].silt = 50.0;
353 cls_silty_clay_loam[3].sand = 20.0;
354 cls_silty_clay_loam[3].clay = 40.0;
355 cls_silty_clay_loam[3].silt = 40.0;
356 /* Check for index 5 */
357 /* G_message("in prct2tex(): check for index 5"); */
358 mark[0] =
359 point_in_triangle(sand_input, clay_input, silt_input,
360 cls_silty_clay_loam[0].sand,
361 cls_silty_clay_loam[0].clay,
362 cls_silty_clay_loam[0].silt,
363 cls_silty_clay_loam[1].sand,
364 cls_silty_clay_loam[1].clay,
365 cls_silty_clay_loam[1].silt,
366 cls_silty_clay_loam[2].sand,
367 cls_silty_clay_loam[2].clay,
368 cls_silty_clay_loam[2].silt);
369 mark[1] =
370 point_in_triangle(sand_input, clay_input, silt_input,
371 cls_silty_clay_loam[0].sand,
372 cls_silty_clay_loam[0].clay,
373 cls_silty_clay_loam[0].silt,
374 cls_silty_clay_loam[2].sand,
375 cls_silty_clay_loam[2].clay,
376 cls_silty_clay_loam[2].silt,
377 cls_silty_clay_loam[3].sand,
378 cls_silty_clay_loam[3].clay,
379 cls_silty_clay_loam[3].silt);
380 /* G_message("Silty Clay Loam: mark[0]=%f",mark[0]); */
381 /* G_message("Silty Clay Loam: mark[1]=%f",mark[1]); */
382 if (mark[0] == 1 || mark[1] == 1) {
383 index = 5;
384 /* G_message("Silty Clay Loam: index labelled as 5"); */
385 }
386 }
387 if (index == 20) { /* if index not found then continue */
388 /*Feed the polygons for index 6 */
389 cls_sand[0].sand = 85.0;
390 cls_sand[0].clay = 15.0;
391 cls_sand[0].silt = 0.0;
392 cls_sand[1].sand = 85.0;
393 cls_sand[1].clay = 0.0;
394 cls_sand[1].silt = 15.0;
395 cls_sand[2].sand = 100.0;
396 cls_sand[2].clay = 0.0;
397 cls_sand[2].silt = 0.0;
398 /* Check for index 6 */
399 mark[0] =
400 point_in_triangle(sand_input, clay_input, silt_input,
401 cls_sand[0].sand, cls_sand[0].clay,
402 cls_sand[0].silt, cls_sand[1].sand,
403 cls_sand[1].clay, cls_sand[1].silt,
404 cls_sand[2].sand, cls_sand[2].clay,
405 cls_sand[2].silt);
406 /* G_message("Sand: mark[0]=%f",mark[0]); */
407 if (mark[0] == 1) {
408 index = 6;
409 /* G_message("Sand: index labelled as 6"); */
410 }
411 }
412 if (index == 20) { /* if index not found then continue */
413 /*Feed the polygons for index 7 */
414 cls_loamy_sand[0].sand = 80.0;
415 cls_loamy_sand[0].clay = 20.0;
416 cls_loamy_sand[0].silt = 0.0;
417 cls_loamy_sand[1].sand = 70.0;
418 cls_loamy_sand[1].clay = 0.0;
419 cls_loamy_sand[1].silt = 30.0;
420 cls_loamy_sand[2].sand = 85.0;
421 cls_loamy_sand[2].clay = 0.0;
422 cls_loamy_sand[2].silt = 15.0;
423 cls_loamy_sand[3].sand = 85.0;
424 cls_loamy_sand[3].clay = 15.0;
425 cls_loamy_sand[3].silt = 0.0;
426 /* Check for index 7 */
427 /* G_message("in prct2tex(): check for index 7"); */
428 mark[0] =
429 point_in_triangle(sand_input, clay_input, silt_input,
430 cls_loamy_sand[0].sand, cls_loamy_sand[0].clay,
431 cls_loamy_sand[0].silt, cls_loamy_sand[1].sand,
432 cls_loamy_sand[1].clay, cls_loamy_sand[1].silt,
433 cls_loamy_sand[2].sand, cls_loamy_sand[2].clay,
434 cls_loamy_sand[2].silt);
435 mark[1] =
436 point_in_triangle(sand_input, clay_input, silt_input,
437 cls_loamy_sand[0].sand, cls_loamy_sand[0].clay,
438 cls_loamy_sand[0].silt, cls_loamy_sand[2].sand,
439 cls_loamy_sand[2].clay, cls_loamy_sand[2].silt,
440 cls_loamy_sand[3].sand, cls_loamy_sand[3].clay,
441 cls_loamy_sand[3].silt);
442 /* G_message("Loamy Sand: mark[0]=%f",mark[0]); */
443 /* G_message("Loamy Sand: mark[1]=%f",mark[1]); */
444 if (mark[0] == 1 || mark[1] == 1) {
445 index = 7;
446 /* G_message("Loamy Sand: index labelled as 7"); */
447 }
448 }
449
450 if (index == 20) { /* if index not found then continue */
451 /*Feed the polygons for index 8 */
452 cls_sandy_loam[0].sand = 75.0;
453 cls_sandy_loam[0].clay = 25.0;
454 cls_sandy_loam[0].silt = 0.0;
455 cls_sandy_loam[1].sand = 55.0;
456 cls_sandy_loam[1].clay = 25.0;
457 cls_sandy_loam[1].silt = 20.0;
458 cls_sandy_loam[2].sand = 55.0;
459 cls_sandy_loam[2].clay = 10.0;
460 cls_sandy_loam[2].silt = 35.0;
461 cls_sandy_loam[3].sand = 40.0;
462 cls_sandy_loam[3].clay = 10.0;
463 cls_sandy_loam[3].silt = 50.0;
464 cls_sandy_loam[4].sand = 50.0;
465 cls_sandy_loam[4].clay = 0.0;
466 cls_sandy_loam[4].silt = 50.0;
467 cls_sandy_loam[5].sand = 70.0;
468 cls_sandy_loam[5].clay = 0.0;
469 cls_sandy_loam[5].silt = 30.0;
470 cls_sandy_loam[6].sand = 80.0;
471 cls_sandy_loam[6].clay = 20.0;
472 cls_sandy_loam[6].silt = 0.0;
473 /* Check for index 8 */
474 /* G_message("in prct2tex(): check for index 8"); */
475 mark[0] =
476 point_in_triangle(sand_input, clay_input, silt_input,
477 cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
478 cls_sandy_loam[2].silt, cls_sandy_loam[3].sand,
479 cls_sandy_loam[3].clay, cls_sandy_loam[3].silt,
480 cls_sandy_loam[4].sand, cls_sandy_loam[4].clay,
481 cls_sandy_loam[4].silt);
482 mark[1] =
483 point_in_triangle(sand_input, clay_input, silt_input,
484 cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
485 cls_sandy_loam[2].silt, cls_sandy_loam[4].sand,
486 cls_sandy_loam[4].clay, cls_sandy_loam[4].silt,
487 cls_sandy_loam[5].sand, cls_sandy_loam[5].clay,
488 cls_sandy_loam[5].silt);
489 mark[2] =
490 point_in_triangle(sand_input, clay_input, silt_input,
491 cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
492 cls_sandy_loam[2].silt, cls_sandy_loam[5].sand,
493 cls_sandy_loam[5].clay, cls_sandy_loam[5].silt,
494 cls_sandy_loam[6].sand, cls_sandy_loam[6].clay,
495 cls_sandy_loam[6].silt);
496 mark[3] =
497 point_in_triangle(sand_input, clay_input, silt_input,
498 cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
499 cls_sandy_loam[2].silt, cls_sandy_loam[6].sand,
500 cls_sandy_loam[6].clay, cls_sandy_loam[6].silt,
501 cls_sandy_loam[0].sand, cls_sandy_loam[0].clay,
502 cls_sandy_loam[0].silt);
503 mark[4] =
504 point_in_triangle(sand_input, clay_input, silt_input,
505 cls_sandy_loam[2].sand, cls_sandy_loam[2].clay,
506 cls_sandy_loam[2].silt, cls_sandy_loam[0].sand,
507 cls_sandy_loam[0].clay, cls_sandy_loam[0].silt,
508 cls_sandy_loam[1].sand, cls_sandy_loam[1].clay,
509 cls_sandy_loam[1].silt);
510 /* G_message("Sandy Loam: mark[0]=%f",mark[0]); */
511 /* G_message("Sandy Loam: mark[1]=%f",mark[1]); */
512 if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1 || mark[3] == 1 ||
513 mark[4] == 1) {
514 index = 8;
515 /* G_message("Sandy Loam: index labelled as 8"); */
516 }
517 }
518
519 if (index == 20) { /* if index not found then continue */
520 /*Feed the polygons for index 9 */
521 cls_loam[0].sand = 50.0;
522 cls_loam[0].clay = 30.0;
523 cls_loam[0].silt = 20.0;
524 cls_loam[1].sand = 20.0;
525 cls_loam[1].clay = 30.0;
526 cls_loam[1].silt = 50.0;
527 cls_loam[2].sand = 40.0;
528 cls_loam[2].clay = 10.0;
529 cls_loam[2].silt = 50.0;
530 cls_loam[3].sand = 55.0;
531 cls_loam[3].clay = 10.0;
532 cls_loam[3].silt = 35.0;
533 cls_loam[4].sand = 55.0;
534 cls_loam[4].clay = 25.0;
535 cls_loam[4].silt = 15.0;
536 /* Check for index 9 */
537 /* G_message("in prct2tex(): check for index 9"); */
538 mark[0] =
539 point_in_triangle(sand_input, clay_input, silt_input,
540 cls_loam[0].sand, cls_loam[0].clay,
541 cls_loam[0].silt, cls_loam[1].sand,
542 cls_loam[1].clay, cls_loam[1].silt,
543 cls_loam[2].sand, cls_loam[2].clay,
544 cls_loam[2].silt);
545 mark[1] =
546 point_in_triangle(sand_input, clay_input, silt_input,
547 cls_loam[0].sand, cls_loam[0].clay,
548 cls_loam[0].silt, cls_loam[2].sand,
549 cls_loam[2].clay, cls_loam[2].silt,
550 cls_loam[3].sand, cls_loam[3].clay,
551 cls_loam[3].silt);
552 mark[2] =
553 point_in_triangle(sand_input, clay_input, silt_input,
554 cls_loam[0].sand, cls_loam[0].clay,
555 cls_loam[0].silt, cls_loam[3].sand,
556 cls_loam[3].clay, cls_loam[3].silt,
557 cls_loam[4].sand, cls_loam[4].clay,
558 cls_loam[4].silt);
559 /* G_message("Sandy Loam: mark[0]=%f",mark[0]); */
560 /* G_message("Sandy Loam: mark[1]=%f",mark[1]); */
561 if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1) {
562 index = 9;
563 /* G_message("Loam: index labelled as 9"); */
564 }
565 }
566
567 if (index == 20) { /* if index not found then continue */
568 /*Feed the polygons for index 10 */
569 cls_silt_loam[0].sand = 20.0;
570 cls_silt_loam[0].clay = 30.0;
571 cls_silt_loam[0].silt = 50.0;
572 cls_silt_loam[1].sand = 0.0;
573 cls_silt_loam[1].clay = 30.0;
574 cls_silt_loam[1].silt = 70.0;
575 cls_silt_loam[2].sand = 0.0;
576 cls_silt_loam[2].clay = 10.0;
577 cls_silt_loam[2].silt = 90.0;
578 cls_silt_loam[3].sand = 15.0;
579 cls_silt_loam[3].clay = 10.0;
580 cls_silt_loam[3].silt = 75.0;
581 cls_silt_loam[4].sand = 25.0;
582 cls_silt_loam[4].clay = 0.0;
583 cls_silt_loam[4].silt = 75.0;
584 cls_silt_loam[5].sand = 50.0;
585 cls_silt_loam[5].clay = 0.0;
586 cls_silt_loam[5].silt = 50.0;
587 /* Check for index 10 */
588 /* G_message("in prct2tex(): check for index 10"); */
589 mark[0] =
590 point_in_triangle(sand_input, clay_input, silt_input,
591 cls_silt_loam[3].sand, cls_silt_loam[3].clay,
592 cls_silt_loam[3].silt, cls_silt_loam[4].sand,
593 cls_silt_loam[4].clay, cls_silt_loam[4].silt,
594 cls_silt_loam[5].sand, cls_silt_loam[5].clay,
595 cls_silt_loam[5].silt);
596 mark[1] =
597 point_in_triangle(sand_input, clay_input, silt_input,
598 cls_silt_loam[3].sand, cls_silt_loam[3].clay,
599 cls_silt_loam[3].silt, cls_silt_loam[5].sand,
600 cls_silt_loam[5].clay, cls_silt_loam[5].silt,
601 cls_silt_loam[0].sand, cls_silt_loam[0].clay,
602 cls_silt_loam[0].silt);
603 mark[2] =
604 point_in_triangle(sand_input, clay_input, silt_input,
605 cls_silt_loam[3].sand, cls_silt_loam[3].clay,
606 cls_silt_loam[3].silt, cls_silt_loam[0].sand,
607 cls_silt_loam[0].clay, cls_silt_loam[0].silt,
608 cls_silt_loam[1].sand, cls_silt_loam[1].clay,
609 cls_silt_loam[1].silt);
610 mark[3] =
611 point_in_triangle(sand_input, clay_input, silt_input,
612 cls_silt_loam[3].sand, cls_silt_loam[3].clay,
613 cls_silt_loam[3].silt, cls_silt_loam[1].sand,
614 cls_silt_loam[1].clay, cls_silt_loam[1].silt,
615 cls_silt_loam[2].sand, cls_silt_loam[2].clay,
616 cls_silt_loam[2].silt);
617 /* G_message("Silt Loam: mark[0]=%f",mark[0]); */
618 /* G_message("Silt Loam: mark[1]=%f",mark[1]); */
619 /* G_message("Silt Loam: mark[2]=%f",mark[2]); */
620 /* G_message("Silt Loam: mark[3]=%f",mark[3]); */
621 if (mark[0] == 1 || mark[1] == 1 || mark[2] == 1 || mark[3] == 1) {
622 index = 10;
623 /* G_message("Silt Loam: index labelled as 10"); */
624 }
625 }
626
627 if (index == 20) { /* if index not found then continue */
628 /*Feed the polygons for index 11 */
629 cls_silt[0].sand = 15.0;
630 cls_silt[0].clay = 10.0;
631 cls_silt[0].silt = 75.0;
632 cls_silt[1].sand = 0.0;
633 cls_silt[1].clay = 10.0;
634 cls_silt[1].silt = 90.0;
635 cls_silt[2].sand = 0.0;
636 cls_silt[2].clay = 0.0;
637 cls_silt[2].silt = 100.0;
638 cls_silt[3].sand = 25.0;
639 cls_silt[3].clay = 0.0;
640 cls_silt[3].silt = 75.0;
641 /* Check for index 11 */
642 /* G_message("in prct2tex(): check for index 11"); */
643 mark[0] =
644 point_in_triangle(sand_input, clay_input, silt_input,
645 cls_silt[0].sand, cls_silt[0].clay,
646 cls_silt[0].silt, cls_silt[1].sand,
647 cls_silt[1].clay, cls_silt[1].silt,
648 cls_silt[2].sand, cls_silt[2].clay,
649 cls_silt[2].silt);
650 mark[1] =
651 point_in_triangle(sand_input, clay_input, silt_input,
652 cls_silt[0].sand, cls_silt[0].clay,
653 cls_silt[0].silt, cls_silt[2].sand,
654 cls_silt[2].clay, cls_silt[2].silt,
655 cls_silt[3].sand, cls_silt[3].clay,
656 cls_silt[3].silt);
657 /* G_message("Silt: mark[0]=%f",mark[0]); */
658 /* G_message("Silt: mark[1]=%f",mark[1]); */
659 if (mark[0] == 1 || mark[1] == 1) {
660 index = 11;
661 /* G_message("Silt: index labelled as 11"); */
662 }
663 }
664 if(index==0){
665 G_debug(1,"clay");
666 } else if (index==1){
667 G_debug(1,"sandy clay");
668 } else if (index==2){
669 G_debug(1,"silty clay");
670 } else if (index==3){
671 G_debug(1,"sandy clay loam");
672 } else if (index==4){
673 G_debug(1,"clay loam");
674 } else if (index==5){
675 G_debug(1,"silty clay loam");
676 } else if (index==6){
677 G_debug(1,"sand");
678 } else if (index==7){
679 G_debug(1,"loamy sand");
680 } else if (index==8){
681 G_debug(1,"sandy loam");
682 } else if (index==9){
683 G_debug(1,"loam");
684 } else if (index==10){
685 G_message("silt loam");
686 } else if (index==11){
687 G_debug(1,"silt");
688 } else {
689 G_debug(1,"Unable to allocate class");
690 }
691 return index;
692 }
693