Guest User

Untitled

a guest
Apr 19th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. /*
  2.  
  3. angle.cpp
  4.  
  5. compute angle given sine and cosine
  6.  
  7. */
  8. #include <cmath>
  9. #include <cstdio>
  10. #include <cassert>
  11. #include <cstdlib>
  12.  
  13. int quadrant(double x, double y);
  14. void usage(FILE *fp);
  15.  
  16. #define PI 3.14159265358979323846
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20. if (argc == 1)
  21. {
  22. usage(stderr);
  23. return 1;
  24. }
  25.  
  26. if (argv[1][0] == '-' && argv[1][1] == 'h')
  27. {
  28. usage(stdout);
  29. return 0;
  30. }
  31.  
  32. if (argc != 3)
  33. {
  34. usage(stderr);
  35. return 1;
  36. }
  37.  
  38. char *endptr;
  39. double x = strtod(argv[1], &endptr);
  40. double y = strtod(argv[2], &endptr);
  41.  
  42. double diag = _hypot(x, y);
  43. if (diag == 0)
  44. {
  45. fprintf(stderr, "hypotenuse has zero length\n");
  46. return 2;
  47. }
  48.  
  49. double xHat = x/diag;
  50. double yHat = y/diag;
  51. int quad = quadrant(xHat, yHat);
  52. switch(quad)
  53. {
  54. case 1:
  55. printf("%f\n", asin(yHat));
  56. break;
  57. case 2:
  58. printf("%f\n", acos(xHat));
  59. break;
  60. case 3:
  61. printf("%f\n", 2*PI - acos(xHat));
  62. break;
  63. case 4:
  64. printf("%f\n", 2*PI + asin(yHat));
  65. break;
  66. }
  67.  
  68. assert(false);
  69. return 0;
  70. }
  71.  
  72. int quadrant(double x, double y)
  73. {
  74. if (y >= 0)
  75. {
  76. if (x >= 0)
  77. return 1;
  78. if (x < 0)
  79. return 2;
  80. }
  81. else if (y < 0)
  82. {
  83. if (x < 0)
  84. return 3;
  85. if (x >= 0)
  86. return 4;
  87. }
  88.  
  89. assert(false);
  90. return 42;
  91. }
  92.  
  93. void usage(FILE *fp)
  94. {
  95. fprintf(fp,
  96. "usage: angle x_coordinate y_coordinate\n"
  97. "prints the angle between (x, y) and the initial line\n");
  98. }
Add Comment
Please, Sign In to add comment