控制台画圆
【题目】用星号在控制上近似地画出一个圆形
圆是对称的。只要画出一部分就可以复制了。比如先生成右下角的四分之一圆。
取坐标如下图:
让 y 的值在 0 到 R 之间均匀变化,算出相应的 x 值
x
=
r
2
−
y
2
x = \sqrt {r ^ 2 - y ^ 2}
x=r2−y2
然后,把这部分镜像变换生成整个圆(拼接的边缘可能要修补一下)。
haskell 代码:
circleStar :: Int -> [String]
circleStar r = let
fr = fromIntegral
kk = 2.2 ---- x轴方向需要放大的比率
--- 右下部分,横坐标对纵坐标的依赖关系
fx :: Int -> Int
fx y = round . (*kk) . sqrt . fr $ r^2 - y^2
--- 右下部分,横坐标为 x 的星号,其所在行是....
p1 x = replicate (x - 1) ' '
p2 x = replicate (fx 0 - x) ' '
line x = p1 x ++ "*" ++ p2 x
--- 右下部分,四分之一圆
f1 = [ line (fx y) | y <- [0..r] ]
--- 下方半个圆
f2 = map (\x -> reverse (tail x) ++ x) f1
--- 整个圆
f4 = reverse (tail f2) ++ f2
in
f4
main :: IO ()
main = putStr $ unlines (circleStar 15)
让人不太满意的地方有:
- 在整数,浮点数间转换的时候,总要额外的 fromIntegral 函数, 看着心烦。
- 因为 y 值均匀取值,造成圆的上下两极星号较疏,“赤道”附近的点很密。
更好的方法是按计算机图形学上,在光栅设备上画圆的各种大法,采用极坐标法(或其它快速算法)生成。