Advertisement
Guest User

VerticalScan_FloodFill

a guest
Dec 19th, 2014
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. ///Scr_FloodFill( ds_grid , scan_xstart , scan_ystart , value_fill )
  2. var grid , grd_w , grd_h , val_r , val_f , scn_x , scn_y;
  3. grid = argument[ 0 ];
  4. grd_w = ds_grid_width( grid );
  5. grd_h = ds_grid_height( grid );
  6. scn_x = argument[ 1 ];
  7. scn_y = argument[ 2 ];
  8. val_f = argument[ 3 ];
  9. val_r = ds_grid_get( grid , scn_x , scn_y );
  10.  
  11. var map_x , map_y;
  12. map_x = ds_map_create();
  13. map_y = ds_map_create();
  14.  
  15. ds_map_add( map_x , ( scn_y * grd_w ) + scn_x , scn_x );
  16. ds_map_add( map_y , ( scn_y * grd_w ) + scn_x , scn_y );
  17.  
  18. if ( val_f == val_r ) {
  19. ds_map_destroy( map_x );
  20. ds_map_destroy( map_y );
  21. return 0;
  22. };
  23.  
  24. while( ds_map_size( map_x ) > 0 && ds_map_size( map_y ) > 0 ) {
  25. var cell , prg_y = scn_y , scn_m = 0;
  26.  
  27. while( scn_m < 2 ) {
  28. switch( scn_m ) {
  29. case 0:
  30. prg_y = scn_y;
  31.  
  32. while( true ) {
  33. cell = ( prg_y * grd_w ) + scn_x;
  34. if ( cell < 0 || cell >= ( grd_w * grd_h ) || ( ds_grid_get( grid , scn_x , prg_y ) != val_r ) ) { break; };
  35.  
  36. cell = ( prg_y * grd_w ) + ( scn_x + 1 );
  37. if ( cell > 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x + 1 , prg_y ) == val_r ) {
  38. ds_map_add( map_x , cell , scn_x + 1 );
  39. ds_map_add( map_y , cell , prg_y );
  40. };
  41.  
  42. cell = ( prg_y * grd_w ) + ( scn_x - 1 );
  43. if ( cell > 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x - 1 , prg_y ) == val_r ) {
  44. ds_map_add( map_x , cell , scn_x - 1 );
  45. ds_map_add( map_y , cell , prg_y );
  46. };
  47.  
  48. cell = ( prg_y * grd_w ) + scn_x;
  49. if ( prg_y != scn_y ) {
  50. ds_map_delete( map_x , cell );
  51. ds_map_delete( map_y , cell );
  52. };
  53.  
  54. ds_grid_set( grid , scn_x , prg_y , val_f );
  55. prg_y --;
  56. };
  57.  
  58. scn_m = 1;
  59. break;
  60. case 1:
  61. prg_y = scn_y + 1;
  62.  
  63. while( true ) {
  64. cell = ( prg_y * grd_w ) + scn_x;
  65. if ( ( cell < 0 ) || ( cell >= ( grd_w * grd_h ) ) || ( ds_grid_get( grid , scn_x , prg_y ) != val_r ) ) { break; };
  66.  
  67. cell = ( prg_y * grd_w ) + ( scn_x + 1 );
  68. if ( cell >= 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x + 1 , prg_y ) == val_r ) {
  69. ds_map_add( map_x , cell , scn_x + 1 );
  70. ds_map_add( map_y , cell , prg_y );
  71. };
  72.  
  73. cell = ( prg_y * grd_w ) + ( scn_x - 1 );
  74. if ( cell >= 0 && cell < ( grd_w * grd_h ) && ds_grid_get( grid , scn_x - 1 , prg_y ) == val_r ) {
  75. ds_map_add( map_x , cell , scn_x - 1 );
  76. ds_map_add( map_y , cell , prg_y );
  77. };
  78.  
  79. cell = ( prg_y * grd_w ) + scn_x;
  80. if ( prg_y != scn_y ) {
  81. ds_map_delete( map_x , cell );
  82. ds_map_delete( map_y , cell );
  83. };
  84.  
  85. ds_grid_set( grid , scn_x , prg_y , val_f );
  86. prg_y ++;
  87. };
  88.  
  89. scn_m = 2;
  90. break;
  91. default: break;
  92. };
  93. };
  94.  
  95. cell = ( scn_y * grd_w ) + scn_x;
  96. if ( cell >= 0 && cell <= ( grd_w * grd_h ) ) {
  97. ds_map_delete( map_x , cell );
  98. ds_map_delete( map_y , cell );
  99. };
  100.  
  101. scn_x = ds_map_find_value( map_x , ds_map_find_first( map_x ) );
  102. scn_y = ds_map_find_value( map_y , ds_map_find_first( map_x ) );
  103. };
  104.  
  105. ds_map_destroy( map_x );
  106. ds_map_destroy( map_y );
  107. return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement