bashとループのみを使って半円を描く

bashとループのみを使って半円を描く

forループだけを使ってbashで半円を描きたいです。スクリプトはユーザー入力に基づいて半円を生成して印刷する必要があります。私の問題は、印刷物の間に空白が生じることです。誰でも私を助けることができますか?これが私が今まで持っているものです。これは逆のピラミッドを生成することを知っていますが、アイデアは対角線を取得し、最後の行にさらに「O」を入れて、一種の半円を生成することです。

read -p "Semi Circle length: " n

for(( i=$n ; i>=1 ; i-- ))
do
        for(( j=($n-i) ; j>=1 ; j-- ))
        do
            echo -n " "
        done

        for(( k=(2*$i)-1 ; k>=1 ; k-- ))
        do
            echo -n "O"
        done
        echo
done

この出力

OOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOO
  OOOOOOOOOOOOOOO
   OOOOOOOOOOOOO
    OOOOOOOOOOO
     OOOOOOOOO
      OOOOOOO
       OOOOO
        OOO
         O

もっと似たものが欲しい

OOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOO
  OOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOO
    OOOOOOOOOOOOOO
      OOOOOOOOOO
          OO

出力は次のようにする必要があります

ベストアンサー1

@saga trig 追加拡張

read -p "Semi Circle radius tolerance: " n w
R2=$((n*n))

for(( x=-$n ; x<=$n ; x+=2 )); do
    for ((y=-$n ; y<=$n ; y++)); do
        d=$((x*x + y*y))
        if [ $((d-R2)) -lt $w ] && [ $((R2-d)) -lt $w ] ; then echo -n "*"; else echo -n " "; fi
    done
    echo 
done

半径20と公差10の出力

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


 *                                     * 

*                                       *
*                                       *
*                                       *

 *                                     * 


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

完全な半円体験

read -p "Semi Circle radius tolerance: " n w
R2=$((n*n))

echo
for(( x=0 ; x>=-$n ; x-=2 )); do
    for ((y=-$n ; y<=$n ; y++)); do
        d=$((x*x + y*y))
        if [ $((d-R2)) -lt $w ] && [ $((R2-d)) -lt $w ] || [ $x -eq 0 ]; then echo -n "*"; else echo -n " "; fi
    done
    echo 
done
echo

半径は20、公差は12です。

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

 *                                     * 

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

編集する

楽しさのために切り捨てを避けるためにボックスを追加し、変数名を慎重に変更し、半径許容誤差テストを単一の条件で具体化しました。

read -p "Circle enter: radius tolerance.... " r t
r2=$((r*r))
t2=$((t*t))
box=$((r+t/10))
for(( y=-$box ; y<=$box ; y+=2 )); do
    for ((x=-$box ; x<=$box ; x++)); do
        d=$((x*x + y*y-r2))
        d2=$((d*d))
        if [ $d2 -lt $t2 ]; then echo -n "*"; else echo -n " "; fi
    done
    echo 
done

おすすめ記事