まるく塗りつぶす

1ドットずつプロットしてまるく塗りつぶしたい。


以前悩みながらやったのに、やり方を忘れていたのでまた悩んだ。
やりかたを忘れてるというか、三角関数をどう使うかをいちいち考えるのが面倒くさいのでメモしておく。


直径 x 直径 で全部塗りつぶせば、正方形になる。
Y軸を捜査して、X軸を塗りつぶす数を線形に増加→減少すれば菱形になる。
同じようにY軸で捜査して、X軸を塗りつぶす数を丸く変化させると円になる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import math

def drawCircle(data, center, radius, value='*'):
    for i in range(-radius, radius):
        radian = math.asin(abs(i) / float(radius))
        w = round(abs(i) / math.tan(radian)) if radian else radius
        for j in range(-w, w):
            x, y = center[0] + j, center[1] + i
            if 0 <= x < len(data[0]) and 0 <= y < len(data):
                data[y][x] = value
    

data = [ [ ' ' ] * 40 for i in range(40) ]

drawCircle(data, center=(20, 20), radius=16);

for line in data: print ''.join(line)


結果

                                        
                                        
                                        
                                        
                                        
              ************              
            ****************            
           ******************           
         **********************         
        ************************        
        ************************        
       **************************       
      ****************************      
      ****************************      
     ******************************     
     ******************************     
     ******************************     
    ********************************    
    ********************************    
    ********************************    
    ********************************    
    ********************************    
    ********************************    
    ********************************    
     ******************************     
     ******************************     
     ******************************     
      ****************************      
      ****************************      
       **************************       
        ************************        
        ************************        
         **********************         
           ******************           
            ****************            
              ************