问题
判断一个特定点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)
}
总结
重点在于知道要目标任务,并且将目标任务转化为方程描述,继而对方程这个参数根据处理步骤进行转化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。