haskell 基础题解(44)

控制台画圆

【题目】用星号在控制上近似地画出一个圆形

圆是对称的。只要画出一部分就可以复制了。比如先生成右下角的四分之一圆。
取坐标如下图:
在这里插入图片描述
让 y 的值在 0 到 R 之间均匀变化,算出相应的 x 值
x = r 2 − y 2 x = \sqrt {r ^ 2 - y ^ 2} x=r2y2

然后,把这部分镜像变换生成整个圆(拼接的边缘可能要修补一下)。
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)

让人不太满意的地方有:

  1. 在整数,浮点数间转换的时候,总要额外的 fromIntegral 函数, 看着心烦。
  2. 因为 y 值均匀取值,造成圆的上下两极星号较疏,“赤道”附近的点很密。

更好的方法是按计算机图形学上,在光栅设备上画圆的各种大法,采用极坐标法(或其它快速算法)生成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值