plotborder.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. #include <grass/display.h>
  5. int plot_border(double grid_size, double east, double north)
  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. /* 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 = window.south + row_dist;
  16. window.east = window.east - colm_dist;
  17. steps = grid_size / 10.; /* tick marks number */
  18. shortmark = 180.; /* tick marks length */
  19. middlemark = 90.;
  20. longmark = 45.;
  21. /* plot boundary lines: */
  22. /* horizontal : */
  23. D_line_abs(window.west, window.south, window.east, window.south);
  24. D_line_abs(window.west, window.north, window.east, window.north);
  25. /* vertical : */
  26. D_line_abs(window.west, window.south, window.west, window.north);
  27. D_line_abs(window.east, window.south, window.east, window.north);
  28. /* Draw vertical border marks */
  29. if (window.west < east)
  30. x = floor((window.west - east) / grid_size) * grid_size + east;
  31. else
  32. x = east - ceil((east - window.west) / grid_size) * grid_size;
  33. while (x <= window.east) {
  34. loop = 0;
  35. for (i = 0; i <= grid_size; i = i + steps) {
  36. if (loop == 0) {
  37. D_line_abs(x + i, window.south + (window.north - window.south) / longmark, x + i, window.south);
  38. D_line_abs(x + i, window.north, x + i, window.north - (window.north - window.south) / longmark);
  39. }
  40. if (loop == 5) {
  41. D_line_abs(x + i,window.south + (window.north - window.south) / middlemark, x + i, window.south);
  42. D_line_abs(x + i, window.north, x + i, window.north - (window.north - window.south) / middlemark);
  43. }
  44. else {
  45. D_line_abs(x + i, window.south + (window.north - window.south) / shortmark, x + i, window.south);
  46. D_line_abs(x + i, window.north, x + i, window.north - (window.north - window.south) / shortmark);
  47. }
  48. loop++;
  49. }
  50. x += grid_size;
  51. }
  52. /* Draw horizontal border marks */
  53. if (window.south > north)
  54. y = floor((window.south - north) / grid_size) * grid_size + north;
  55. else
  56. y = north - ceil((north - window.south) / grid_size) * grid_size;
  57. while (y <= window.north) {
  58. loop = 0;
  59. for (i = 0; i <= grid_size; i = i + steps) {
  60. if (loop == 0) {
  61. D_line_abs(window.west, y + i, window.west + (window.east - window.west) / longmark, y + i);
  62. D_line_abs(window.east - (window.east - window.west) / longmark, y + i, window.east, y + i);
  63. }
  64. if (loop == 5) {
  65. D_line_abs(window.west, y + i, window.west + (window.east - window.west) / middlemark, y + i);
  66. D_line_abs(window.east - (window.east - window.west) / middlemark, y + i, window.east, y + i);
  67. }
  68. else {
  69. D_line_abs(window.west, y + i, window.west + (window.east - window.west) / shortmark, y + i);
  70. D_line_abs(window.east - (window.east - window.west) / shortmark, y + i, window.east, y + i);
  71. }
  72. loop++;
  73. }
  74. y += grid_size;
  75. }
  76. return 0;
  77. }