2014-11-12 10 views
5

Sto disegnando con Sprite Kit. Vorrei rilevare quando i disegni dell'utente si intersecano.
enter image description hereSwift: rilevamento intersezione da kit sprite SKShapeNode disegni

Ho provato a seguire il codice ma non funziona. Sembra che il kit sprite non stia salvando tutti i punti:

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 
    touch = touches.anyObject() as UITouch!   
    for drawingPoint in drawingPoints{ 
     if(touch.locationInNode(self) == drawingPoint){println(true)} 
    } 
    drawingPoints.append(touch.locationInNode(self)) 
} 
+1

Non ho molta familiarità con SpriteKit, ma presumo che il percorso rosso colleghi ogni punto di contatto con il successivo utilizzando un segmento di linea o una curva di Bézier. In tal caso devi controllare tutti i segmenti per l'eventuale intersezione. [Qui] (http://stackoverflow.com/questions/13999249/uibezierpath-intersect) è un problema simile in Objective-C, forse questo ti aiuta a iniziare. –

+0

Grazie, darò un'occhiata! – user3673836

+1

Un algoritmo più sofisticato è descritto qui: http://softsurfer.com/Archive/algorithm_0108/algorithm_0108.htm. –

risposta

0

Ecco una funzione per l'intersezione di segmenti in rapido.

func linesIntersect(line1 : CGPointInterval, line2 : CGPointInterval) -> (intersects: Bool, point : CGPoint?) 
    { 
     //The algorithm is taken from http://www.amazon.com/dp/0672323699/?tag=stackoverfl08-20 
     // http://portal.aauj.edu/portal_resources/downloads/programming/windows_game_programming_guru.pdf 

     let p0_x = line1.start.x 
     let p1_x = line1.end.x 
     let p2_x = line2.start.x 
     let p3_x = line2.end.x 

     let p0_y = line1.start.y 
     let p1_y = line1.end.y 
     let p2_y = line2.start.y 
     let p3_y = line2.end.y 

     let s1_x = p1_x - p0_x 
     let s1_y = p1_y - p0_y 
     let s2_x = p3_x - p2_x 
     let s2_y = p3_y - p2_y 

     let s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y))/(-s2_x * s1_y + s1_x * s2_y) 
     let t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x))/(-s2_x * s1_y + s1_x * s2_y) 

     if (s >= 0 && s <= 1 && t >= 0 && t <= 1) 
     { 
      // Collision detected 
      let finalX = p0_x + (t * s1_x) 
      let finalY = p0_y + (t * s1_y) 
      return (true, CGPointMake(finalX, finalY)) 
     } 

     return (false, nil) // No collision 
    } 
Problemi correlati