我想仅使用 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