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

답변2

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


for(( i=1 ; i<=5+$n ; i++ ))
do
        for(( j=2*$n ; j>=1 ; j-- ))
        do
            D=$((i*i + (j-n)*(j-n)))
            if [ $D -lt $R2 ]; then echo -n '#' ;>
        done
        echo
done

관련 정보