问题

判断一个特定点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)
}

总结

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


Cruise_Chan
729 声望71 粉丝

技能树点歪了...咋办