2014-11-12 8 views
5

스프라이트 키트로 그리기하고 있습니다. 나는 사용자의 그림이 교차 할 때를 감지하고 싶다.
enter image description hereSwift : 스프라이트 키트 SKShapeNode 도면에서 교차 부분을 감지합니다.

나는 다음 코드를 시도했지만 작동하지 않습니다. 스프라이트 키트가 모든 포인트를 저장하지 못하는 것 같습니다.

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

저는 SpriteKit에 익숙하지 않지만, 빨간 선은 선분 또는 베 지어 곡선을 사용하여 각 터치 점을 다음 점과 연결한다고 가정합니다. 이 경우 모든 세그먼트에서 가능한 교차로를 확인해야합니다. [Here] (http://stackoverflow.com/questions/13999249/uibezierpath-intersect)는 Objective-C와 비슷한 문제로, 시작하는 데 도움이 될 것입니다. –

+0

감사합니다. – user3673836

+1

보다 정교한 알고리즘은 http://softsurfer.com/Archive/algorithm_0108/algorithm_0108.htm에 설명되어 있습니다. –

답변

0

다음은 신속하게 세그먼트 교차를위한 함수입니다.

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 
    }