plotborder.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/display.h>
  4. #include "local_proto.h"
  5. int plot_border(double grid_size, double east, double north, int direction)
  6. {
  7. double x, y;
  8. struct Cell_head window;
  9. double i, steps, loop, longmark, middlemark, shortmark;
  10. double row_dist, colm_dist;
  11. G_get_set_window(&window);
  12. /* FIXME: pull right and bottom edges back one pixel; display lib bug? */
  13. row_dist = D_d_to_u_row(0.) - D_d_to_u_row(1.);
  14. colm_dist = D_d_to_u_col(1.) - D_d_to_u_col(0.);
  15. /* window.south += row_dist;
  16. window.east -= colm_dist;
  17. */
  18. steps = grid_size / 10.; /* tick marks number */
  19. shortmark = 180.; /* tick marks length */
  20. middlemark = 90.;
  21. longmark = 45.;
  22. /* plot boundary lines: */
  23. /* horizontal : */
  24. D_line_abs(window.west, window.south, window.east + colm_dist, window.south); /* display lib bug? */
  25. D_line_abs(window.west, window.north, window.east, window.north);
  26. /* vertical : */
  27. D_line_abs(window.west, window.south, window.west, window.north);
  28. D_line_abs(window.east, window.south, window.east, window.north);
  29. /* Draw ticks along top and bottom borders */
  30. if (window.west < east)
  31. x = floor((window.west - east) / grid_size) * grid_size + east;
  32. else
  33. x = east - ceil((east - window.west) / grid_size) * grid_size;
  34. if (direction != DIRN_LAT) {
  35. while (x <= window.east) {
  36. loop = 0;
  37. for (i = 0; i <= grid_size; i = i + steps) {
  38. if (x + i < window.west || x + i > window.east) {
  39. loop++;
  40. continue;
  41. }
  42. if (loop == 0) {
  43. D_line_abs(x + i,
  44. window.south + (window.north - window.south) / longmark, x + i,
  45. window.south);
  46. D_line_abs(x + i, window.north, x + i,
  47. window.north - row_dist - (window.north - window.south) / longmark);
  48. }
  49. if (loop == 5) {
  50. D_line_abs(x + i,
  51. window.south + (window.north - window.south) / middlemark, x + i,
  52. window.south);
  53. D_line_abs(x + i, window.north,
  54. x + i, window.north - row_dist - (window.north - window.south) / middlemark);
  55. }
  56. else {
  57. D_line_abs(x + i,
  58. window.south + (window.north - window.south) / shortmark, x + i,
  59. window.south);
  60. D_line_abs(x + i, window.north,
  61. x + i, window.north - row_dist - (window.north - window.south) / shortmark);
  62. }
  63. loop++;
  64. }
  65. x += grid_size;
  66. }
  67. }
  68. /* Draw ticks along left & right borders */
  69. if (window.south > north)
  70. y = floor((window.south - north) / grid_size) * grid_size + north;
  71. else
  72. y = north - ceil((north - window.south) / grid_size) * grid_size;
  73. if (direction != DIRN_LON) {
  74. while (y <= window.north) {
  75. loop = 0;
  76. for (i = 0; i <= grid_size; i = i + steps) {
  77. if (y + i < window.south || y + i > window.north) {
  78. loop++;
  79. continue;
  80. }
  81. if (loop == 0) {
  82. D_line_abs(window.west, y + i,
  83. window.west + (window.east - window.west) / longmark, y + i);
  84. D_line_abs(window.east - (window.east - window.west) / longmark, y + i,
  85. window.east, y + i);
  86. }
  87. if (loop == 5) {
  88. D_line_abs(window.west, y + i,
  89. window.west + (window.east - window.west) / middlemark, y + i);
  90. D_line_abs(window.east - (window.east - window.west) / middlemark, y + i,
  91. window.east, y + i);
  92. }
  93. else {
  94. D_line_abs(window.west, y + i,
  95. window.west + (window.east - window.west) / shortmark, y + i);
  96. D_line_abs(window.east - (window.east - window.west) / shortmark, y + i,
  97. window.east, y + i);
  98. }
  99. loop++;
  100. }
  101. y += grid_size;
  102. }
  103. }
  104. return 0;
  105. }