parse_line.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <math.h>
  2. #include <string.h>
  3. #include <grass/gis.h>
  4. #include "local_proto.h"
  5. #define PI M_PI
  6. #define Radians(x) ((x) * PI/180.0)
  7. #define Degrees(x) ((x) * 180.0/PI)
  8. int
  9. parse_line(const char *key, char **s, double *e1, double *n1, double *e2,
  10. double *n2, int projection)
  11. {
  12. int err;
  13. double distance, azimuth;
  14. err = 0;
  15. if (!G_scan_easting(s[0], e1, projection))
  16. err |= 1;
  17. if (!G_scan_northing(s[1], n1, projection))
  18. err |= 2;
  19. if (sscanf(s[2], "%lf", &azimuth) != 1)
  20. err |= 4;
  21. if (sscanf(s[3], "%lf", &distance) != 1 || distance < 0.0)
  22. err |= 8;
  23. if (err) {
  24. char warningbuff[256];
  25. char partbuf[64];
  26. sprintf(warningbuff, "%s=", key);
  27. sprintf(partbuf, "%s%s%s,",
  28. err & 1 ? "<" : "", s[0], err & 1 ? ">" : "");
  29. strcat(warningbuff, partbuf);
  30. sprintf(partbuf, "%s%s%s,",
  31. err & 2 ? "<" : "", s[1], err & 2 ? ">" : "");
  32. strcat(warningbuff, partbuf);
  33. sprintf(partbuf, "%s%s%s,",
  34. err & 4 ? "<" : "", s[2], err & 4 ? ">" : "");
  35. strcat(warningbuff, partbuf);
  36. sprintf(partbuf, "%s%s%s",
  37. err & 8 ? "<" : "", s[3], err & 8 ? ">" : "");
  38. strcat(warningbuff, partbuf);
  39. G_warning("%s %s", warningbuff, " invalid values(s)");
  40. return err;
  41. }
  42. *e2 = *e1 + distance * sin(Radians(azimuth));
  43. *n2 = *n1 + distance * cos(Radians(azimuth));
  44. return 0;
  45. }