fork download
  1. #encoding: utf-8
  2. def radius_i( x, y )
  3. return (Math.sqrt( x*x + y*y ) + 0.5 ).ceil;
  4. end
  5. class Canvas
  6. attr_reader :width, :height;
  7. def initialize( width, height )
  8. @width = width; @height = height;
  9. @scr = Array.new( height ){ Array.new( width ){ ' ' } };
  10. print "- 描画サイズは 幅#{@width}x高さ#{@height}です。\n";
  11. end
  12. def draw_circle( a, b, r )
  13. for y in (0 ... @height)
  14. for x in (0 ... @width)
  15. @scr[y][x] = '*' if r == radius_i( x - a, y - b );
  16. end
  17. end
  18. print "- 点(#{a},#{b})に半径#{r}の円を描きました。\n";
  19. end
  20. def get( x, y )
  21. return @scr[y][x];
  22. end
  23. def set( x, y, c )
  24. @scr[y][x] = c;
  25. end
  26. def show
  27. @scr.each do |l|
  28. print l.join, "\n";
  29. end
  30. end
  31. end
  32.  
  33. def h( canvas )
  34. wdt = canvas.width; hgt = canvas.height;
  35. rmax = (wdt < hgt ? wdt : hgt) / 2 + 1;
  36. rmax2 = rmax * 2 + 1;
  37. rmin = 3;
  38. htbl_ndots_by_r = Array.new( rmax ){ 0 };
  39. htbl = Array.new( rmax2 ){ Array.new( rmax2 ){ 0 } };
  40. for x in ( 0 ... rmax2 )
  41. for y in ( 0 ... rmax2 )
  42. r = radius_i( x - rmax, y - rmax );
  43. if rmin < r && r < rmax then
  44. htbl_ndots_by_r[ r ] += 1;
  45. htbl[ x ][ y ] = r;
  46. else
  47. htbl[ x ][ y ] = -1;
  48. end
  49. end
  50. end
  51. for r in ( 0 ... rmax )
  52. if rmin < r then
  53. htbl_ndots_by_r[r] -= htbl_ndots_by_r[r] / 10;
  54. else
  55. htbl_ndots_by_r[r] = 1 << 31 - 1;
  56. end
  57. end
  58. counter = Array.new( wdt ){ Array.new( hgt ){ Array.new( rmax ){ 0 } } };
  59. cnt_loop = 0;
  60. for x in ( 0 ... wdt )
  61. for y in ( 0 ... hgt )
  62. next if canvas.get( x, y ) == ' ';
  63. for u in ( -rmax ... rmax )
  64. for v in ( -rmax ... rmax )
  65. cnt_loop += 1;
  66. x2 = x + u; y2 = y + v;
  67. if 0 <= x2 && x2 < wdt && 0 <= y2 && y2 < hgt then
  68. r = htbl[ u + rmax ][ v + rmax ];
  69. counter[x2][y2][r] += 1 if r != -1;
  70. end
  71. end
  72. end
  73. end
  74. end
  75. print 'Hough tranform fin - ', cnt_loop , " looped.\n";
  76. cnt_loop = 0;
  77. for x in ( 0 ... wdt )
  78. for y in ( 0 ... hgt )
  79. for r in ( 0 ... rmax )
  80. cnt_loop += 1;
  81. if counter[x][y][r] >= htbl_ndots_by_r[ r ] then
  82. print "+ Circle found: (#{x},#{y}) r=#{r}\n";
  83. canvas.set( x, y, '@' );
  84. end
  85. end
  86. end
  87. end
  88. print 'Inverse fin - ', cnt_loop , " looped.\n";
  89. end
  90. $C = Canvas.new( 170, 60 );
  91. $C.draw_circle( 42, 29, 20 );
  92. $C.draw_circle( 40, 18, 4 );
  93. $C.draw_circle( 60, 22, 8 );
  94. h $C;
  95. $C.show;
  96.  
Success #stdin #stdout 0.78s 9184KB
stdin
Standard input is empty
stdout
- 描画サイズは 幅170x高さ60です。
- 点(42,29)に半径20の円を描きました。
- 点(40,18)に半径4の円を描きました。
- 点(60,22)に半径8の円を描きました。
Hough tranform fin - 653480 looped.
+ Circle found: (40,18) r=4
+ Circle found: (42,29) r=20
+ Circle found: (60,22) r=8
Inverse fin - 316200 looped.
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                      *********                                                                                                                           
                                   ***         ***                                                                                                                        
                                 **               **                                                                                                                      
                               **                   **                                                                                                                    
                              **                     **                                                                                                                   
                             *         ***             *  *****                                                                                                           
                            *         *   *             **     **                                                                                                         
                           *         *     *           * *       *                                                                                                        
                          **         *  @  *          *  **       *                                                                                                       
                          *          *     *          *   *       *                                                                                                       
                         *            *   *          *     *       *                                                                                                      
                         *             ***           *     *       *                                                                                                      
                        *                            *      @      *                                                                                                      
                        *                            *      *      *                                                                                                      
                        *                            *      *      *                                                                                                      
                       *                              *      *    *                                                                                                       
                       *                              *      *    *                                                                                                       
                       *                               *     *   *                                                                                                        
                       *                                **   * **                                                                                                         
                       *                  @               *****                                                                                                           
                       *                                     *                                                                                                            
                       *                                     *                                                                                                            
                       *                                     *                                                                                                            
                       *                                     *                                                                                                            
                        *                                   *                                                                                                             
                        *                                   *                                                                                                             
                        *                                   *                                                                                                             
                         *                                 *                                                                                                              
                         *                                 *                                                                                                              
                          *                               *                                                                                                               
                          **                             **                                                                                                               
                           *                             *                                                                                                                
                            *                           *                                                                                                                 
                             *                         *                                                                                                                  
                              **                     **                                                                                                                   
                               **                   **                                                                                                                    
                                 **               **                                                                                                                      
                                   ***         ***                                                                                                                        
                                      *********