plotborder.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/display.h>
  4. int plot_border(double grid_size, double east, double north)
  5. {
  6. double x, y;
  7. struct Cell_head window;
  8. double i, steps, loop, longmark, middlemark, shortmark;
  9. double row_dist, colm_dist;
  10. G_get_set_window(&window);
  11. /* pull right and bottom edges back one pixel; display lib bug? */
  12. row_dist = D_d_to_u_row(0.) - D_d_to_u_row(1.);
  13. colm_dist = D_d_to_u_col(1.) - D_d_to_u_col(0.);
  14. window.south = window.south + row_dist;
  15. window.east = window.east - colm_dist;
  16. steps = grid_size / 10.; /* tick marks number */
  17. shortmark = 180.; /* tick marks length */
  18. middlemark = 90.;
  19. longmark = 45.;
  20. /* plot boundary lines: */
  21. /* horizontal : */
  22. D_line_abs(window.west, window.south, window.east, window.south);
  23. D_line_abs(window.west, window.north, window.east, window.north);
  24. /* vertical : */
  25. D_line_abs(window.west, window.south, window.west, window.north);
  26. D_line_abs(window.east, window.south, window.east, window.north);
  27. /* Draw vertical border marks */
  28. if (window.west < east)
  29. x = floor((window.west - east) / grid_size) * grid_size + east;
  30. else
  31. x = east - ceil((east - window.west) / grid_size) * grid_size;
  32. while (x <= window.east) {
  33. loop = 0;
  34. for (i = 0; i <= grid_size; i = i + steps) {
  35. if (loop == 0) {
  36. D_line_abs(x + i, window.south + (window.north - window.south) / longmark, x + i, window.south);
  37. D_line_abs(x + i, window.north, x + i, window.north - (window.north - window.south) / longmark);
  38. }
  39. if (loop == 5) {
  40. D_line_abs(x + i,window.south + (window.north - window.south) / middlemark, x + i, window.south);
  41. D_line_abs(x + i, window.north, x + i, window.north - (window.north - window.south) / middlemark);
  42. }
  43. else {
  44. D_line_abs(x + i, window.south + (window.north - window.south) / shortmark, x + i, window.south);
  45. D_line_abs(x + i, window.north, x + i, window.north - (window.north - window.south) / shortmark);
  46. }
  47. loop++;
  48. }
  49. x += grid_size;
  50. }
  51. /* Draw horizontal border marks */
  52. if (window.south > north)
  53. y = floor((window.south - north) / grid_size) * grid_size + north;
  54. else
  55. y = north - ceil((north - window.south) / grid_size) * grid_size;
  56. while (y <= window.north) {
  57. loop = 0;
  58. for (i = 0; i <= grid_size; i = i + steps) {
  59. if (loop == 0) {
  60. D_line_abs(window.west, y + i, window.west + (window.east - window.west) / longmark, y + i);
  61. D_line_abs(window.east - (window.east - window.west) / longmark, y + i, window.east, y + i);
  62. }
  63. if (loop == 5) {
  64. D_line_abs(window.west, y + i, window.west + (window.east - window.west) / middlemark, y + i);
  65. D_line_abs(window.east - (window.east - window.west) / middlemark, y + i, window.east, y + i);
  66. }
  67. else {
  68. D_line_abs(window.west, y + i, window.west + (window.east - window.west) / shortmark, y + i);
  69. D_line_abs(window.east - (window.east - window.west) / shortmark, y + i, window.east, y + i);
  70. }
  71. loop++;
  72. }
  73. y += grid_size;
  74. }
  75. return 0;
  76. }