Impulso SKSpriteNode, dependendo da localização tocada Swift 2

Estou aprendendo o Swift 2 e estou fazendo o típico jogo de bola em que você bate na bola, é um impulso. Mas não quero que a bola passe sempre pela coordenada Y, não seria divertido, gostaria de adicionar um impulso dependendo da localização tocada, seguir na direção oposta.

Eu tentei issoexemplo que o ABakerSmith deu ao OP, mas o que ele faz é girar minha bola no mesmo lugar e quase movê-la para um lado.

Então eu peguei esse código, já detectando a bola Sprite touch, funcionando bem. CGVector estendido como ele mencionou.

O que eu estou fazendo errado aqui? talvez os cálculos no CGVector estendido estejam errados no meu caso?

Também tenho que considerar que não deve se mover para baixo, apenas para cima e ambas as direções para a esquerda ou direita, mas não para baixo.

ATUALIZADA Este é o código:

        ball = SKSpriteNode(imageNamed: "ball")
        ball.name = ballCategoryName
        ball.userInteractionEnabled = false
        ball.setScale(0.3)
        ball.zPosition = 2
        ball.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width / 2)
        ball.physicsBody?.friction = 0
        ball.physicsBody?.restitution = 0.7
        ball.physicsBody?.linearDamping = 0
        ball.physicsBody?.allowsRotation = true
        ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
        ball.physicsBody?.dynamic = true
        ball.physicsBody?.affectedByGravity = false

        self.addChild(ball)

        /* during touchesBegan func() */
        if node.name == "ball" {
                score += 1
                scoreLabel.text = "\(score)"

                ball.physicsBody?.velocity = CGVectorMake(0, 0);
                let ballCenter = CGVectorMake(ball.position.x + ball.frame.width / 2,
                                              ball.position.y + ball.frame.height / 2)

                let reflectedPoint = CGVectorMake(2 * ballCenter.dx - location.x,
                                                  2 * ballCenter.dy - location.y)

                print(location.x, location.y, " vs ", reflectedPoint.dx, reflectedPoint.dy)

                ball.physicsBody?.applyImpulse(reflectedPoint, atPoint: location)
      }

E este é o código CGVector estendido:

import Foundation
import SpriteKit

extension CGVector {
    init(p1: CGPoint, p2: CGPoint) {
        self.dx = p1.x - p2.x
        self.dy = p1.y - p2.y
    }

    var length: CGFloat {
        get { return hypot(dx, dy) }

        set {
            normalise()
            dx *= newValue
            dy *= newValue
        }
    }

    mutating func normalise() {
        dx /= length
        dy /= length
    }
}

questionAnswers(0)

yourAnswerToTheQuestion