noc_functions.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "distrm.h"
  5. extern int *idag_mask, *idag_id_arr;
  6. int distance(int core_start, int core_fin){
  7. int x1,x2,y1,y2;
  8. x1 = core_start % X_max;
  9. y1 = core_start / X_max;
  10. //printf("x1 = %d, y1 = %d\n",x1,y1);
  11. x2 = core_fin % X_max;
  12. y2 = core_fin / X_max;
  13. //printf("x2 = %d, y2 = %d\n",x2,y2);
  14. return abs(x1 - x2) + abs(y1 - y2);
  15. }
  16. void get_reg_idags(region cur_reg, int *region_idags){
  17. int y,l,count=0,center_node,cur_line,i,j;
  18. //x = cur_reg.C % X_max;
  19. //y = cur_reg.C / X_max;
  20. for (i=0; i<num_idags_x*num_idags_y; i++) region_idags[i]=0;
  21. region_idags[i]=0;//the one reserved for count is set to 1 for safety
  22. l = cur_reg.r;
  23. //printf("x = %d, y = %d l=%d\n",x,y,l);
  24. center_node = cur_reg.C;
  25. cur_line = center_node / X_max;
  26. while (cur_line >= 0 && l>=0){
  27. cur_line = center_node / X_max;
  28. for (i=0; i<=l; i++){
  29. y = (center_node + i) / X_max;
  30. if (y == cur_line){
  31. for (j=0; j<num_idags_x*num_idags_y; j++)
  32. if (idag_id_arr[j] == idag_mask[center_node + i]) break;
  33. if (region_idags[j] == 0) {
  34. region_idags[j] = 1;
  35. count++;
  36. }
  37. }
  38. y = (center_node - i) / X_max;
  39. if (y == cur_line && (center_node - i)>=0){
  40. for (j=0; j<num_idags_x*num_idags_y; j++)
  41. if (idag_id_arr[j] == idag_mask[center_node - i]) break;
  42. if (region_idags[j] == 0) {
  43. region_idags[j] = 1;
  44. count++;
  45. }
  46. }
  47. }
  48. center_node -= X_max;
  49. cur_line--;
  50. l--;
  51. }
  52. center_node = cur_reg.C + X_max;
  53. l = cur_reg.r-1;
  54. cur_line = center_node / X_max;
  55. while (cur_line < Y_max && l>=0){
  56. cur_line = center_node / X_max;
  57. for (i=0; i<=l; i++){
  58. y = (center_node + i) / X_max;
  59. if (y == cur_line){
  60. for (j=0; j<num_idags_x*num_idags_y; j++)
  61. if (idag_id_arr[j] == idag_mask[center_node + i]) break;
  62. if (region_idags[j] == 0) {
  63. region_idags[j] = 1;
  64. count++;
  65. }
  66. }
  67. y = (center_node - i) / X_max;
  68. if (y == cur_line && (center_node - i)>=0){
  69. for (j=0; j<num_idags_x*num_idags_y; j++)
  70. if (idag_id_arr[j] == idag_mask[center_node - i]) break;
  71. if (region_idags[j] == 0) {
  72. region_idags[j] = 1;
  73. count++;
  74. }
  75. }
  76. }
  77. center_node += X_max;
  78. cur_line++;
  79. l--;
  80. }
  81. region_idags[num_idags_x*num_idags_y] = count;
  82. }
  83. int region_count(region cur_reg){
  84. int x,y,l,count=0;
  85. x = cur_reg.C % X_max;
  86. y = cur_reg.C / X_max;
  87. l = cur_reg.r;
  88. //printf("x = %d, y = %d l=%d\n",x,y,l);
  89. while (y >= 0 && l>=0){
  90. count++;////1 for center
  91. if (x + l < X_max) count += l;
  92. else count += X_max - x -1;
  93. if (x - l >= 0) count += l;
  94. else count += x;
  95. y--;
  96. l--;
  97. }
  98. y = cur_reg.C / X_max + 1;
  99. l = cur_reg.r - 1;
  100. while (y < Y_max && l>=0){
  101. count++;
  102. if (x + l < X_max) count += l;
  103. else count += X_max - x -1;
  104. if (x - l >= 0) count += l;
  105. else count += x;
  106. y++;
  107. l--;
  108. }
  109. return count;
  110. }
  111. //returns on function name the idag_id and in call by name, cluster sizes
  112. int get_cluster_info(int idag_num, int *Cl_x_max, int *Cl_y_max){
  113. int x_coord,y_coord, diff, tmp_cl_x, tmp_cl_y;
  114. tmp_cl_x = X_max / num_idags_x;
  115. tmp_cl_y = Y_max / num_idags_y;
  116. x_coord = (idag_num % num_idags_x) * tmp_cl_x;
  117. y_coord = (idag_num / num_idags_x) * tmp_cl_y;
  118. diff = X_max % num_idags_x;
  119. if ((diff > 0) && (idag_num % num_idags_x < diff)){
  120. x_coord += idag_num % num_idags_x;
  121. tmp_cl_x++;
  122. } else x_coord += diff;
  123. diff = Y_max % num_idags_y;
  124. if ((diff > 0) && (idag_num / num_idags_x < diff)){
  125. y_coord += idag_num / num_idags_x; //se poia grammh - ypsos tou y einai
  126. tmp_cl_y++;
  127. } else y_coord += diff;
  128. //printf("idag_id = %d, x_coord = %d, y_coord = %d\n",idag_num,x_coord,y_coord);
  129. *Cl_x_max = tmp_cl_x;
  130. *Cl_y_max = tmp_cl_y;
  131. return (y_coord * X_max) + x_coord;
  132. }