方程式编程思想 读书笔记

问题

判断一个特定点Position是否在特定的一个区域Region
如何将这个问题用方程式编程的思想进行Coding呢?

思路

1.将这个问题描述代码化 ->
是否:返回布尔值 特定点:参数 区域:"函数化"参数
为了代码可读性一般进行typealias操作:

typealias Position = CGPoint
typealias Distance = CGFloat
let minimumDistance: Distance = 2.0
typealias Region = Position -> Bool

2.描述问题代码化后,此时此景我们已经将重心集中在"函数化"参数Region的处理上,因为通过各种各样的Region处理后,只要将特定点Position传入Region就得到我们问题得解。
现在问题就是编写各种各样我们所需要返回值为Region的函数

// 以radius为半径的范围 默认(0, 0)为圆心
func circle(radius: Distance) -> Region {
    return { p in sqrt(p.x * p.x + p.y * p.y) < radius }
}

// 偏移点的范围
func shift(offset: Position, region: Region) -> Region {
    return { point  in
        let shiftedPoint = Position(x: point.x + offset.x, y: point.y + offset.y)
        return region(shiftedPoint)
    }
}

// 取反的范围
func invert(region: Region) -> Region {
    return { point in !region(point) }
}

// 交集范围
func intersection(region1: Region, region2: Region) -> Region {
    return { point in region1(point) && region2(point) }
}

// 并集范围
func union(region1: Region, region2: Region) -> Region {
    return { point in region1(point) || region2(point) }
}

// 剔除不满足的范围
func difference(region: Region, minusRegion: Region) -> Region {
    return intersection(region, invert(minusRegion))
}

3.丢常规参数求解

func inRange(ownPosition: Position, target: Position, friendly: Position, range: Distance) -> Bool {
    let rangeRegion = difference(circle(range), circle(minimumDistance))
    let targetRegion = shift(ownPosition, rangeRegion)
    let friendlyRegion = shift(friendly, circle(minimumDistance))
    let resultRegion = difference(targetRegion, friendlyRegion)

    return resultRegion(target)
}

总结

重点在于知道要目标任务,并且将目标任务转化为方程描述,继而对方程这个参数根据处理步骤进行转化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值