functional-swift icon indicating copy to clipboard operation
functional-swift copied to clipboard

Thinking Functionally - Example: the complicated canSafelyEngageShip(_:friendly:) function

Open Ribbonlan opened this issue 9 years ago • 1 comments

extension Ship {
func canSafelyEngageShip(target: Ship, friendly: Ship) -> Bool {
let rangeRegion = difference(circle(firingRange),
minus: circle(unsafeRange))
let firingRegion = shift(rangeRegion, offset: position)
let friendlyRegion = shift(circle(unsafeRange),
offset: friendly.position)
let resultRegion = difference(firingRegion, minus: friendlyRegion)
return resultRegion(target.position)
}
}

This line: let friendlyRegion = shift(circle(unsafeRange), offset: friendly.position) should be: let friendlyRegion = shift(circle(friendly.unsafeRange), offset: friendly.position) friendlyRegion should be represented the friendly ship's unsafe region

Ribbonlan avatar Nov 11 '16 16:11 Ribbonlan

Figure 4 Avoiding engaging targets too close to friendly ships

extension Ship {
func canSafelyEngageShip1(target: Ship, friendly: Ship) -> Bool {
let dx = target.position.x - position.x
let dy = target.position.y - position.y
let targetDistance = sqrt(dx * dx + dy * dy)
let friendlyDx = friendly.position.x - target.position.x
let friendlyDy = friendly.position.y - target.position.y
let friendlyDistance = sqrt(friendlyDx * friendlyDx +
friendlyDy * friendlyDy)
return targetDistance <= firingRange
&& targetDistance > unsafeRange
&& (friendlyDistance > unsafeRange)
}
}

This line: return targetDistance <= firingRange && targetDistance > unsafeRange && (friendlyDistance > unsafeRange) should be: return targetDistance <= firingRange && targetDistance > unsafeRange && (friendlyDistance > friendly.unsafeRange)

Ribbonlan avatar Nov 12 '16 06:11 Ribbonlan