2014-10-10 3 views
0

CGMutablePathRef가 3 점 이상 있는지 알고 싶습니다! 이 검사는 자주 발생하므로 효율적인 솔루션을 찾고 있습니다.CGPathRef에서 CGPoints 수를 확인하는 가장 효율적인 방법

내 프로젝트에서 사용자가 모양을 그리기 때문에이 작업을 수행해야하는 이유가 있습니다. 사용자가 손가락을 드래그하면 CGPoint (현재 손가락 위치)가 패스에 추가되고 touchEnded :가 호출 될 때 실제 바디가 추가됩니다. 이제 사용자가 화면을 탭하면 CGMutablePathRef는 그것은 (내 머리 속에 내 추론) 그리고 나는 실제 신체를 추가하기 위해 내 CGMutablePathRef를 사용할 때 다음과 같은 오류가 발생합니다.

Assertion failed: (count >= 2), function CreateChain, file /SourceCache/PhysicsKit/PhysicsKit-6.5.4/PhysicsKit/Box2D/Collision/Shapes/b2ChainShape.cpp, line 45. 

임 즉 매개 변수로 cgpathref를 취하고 그 3 (또는 끝이 3없는 경우)에 도달하고 부울에게

감사를 반환 할 때까지의 포인트를 계산 호출하는 기능을 찾고 :)

+1

? 경로에 곡선이 포함되어 있으면 곡선의 조절 점이 점으로 계산됩니까? –

+0

@robmayoff 확실하지 않습니다 .. 내 편집을 확인하십시오 – 4GetFullOf

+0

경로에 CGPoint를 추가하지 마십시오. 선 또는 곡선을 추가합니다. 선을 추가한다고 가정합니다. 아마 @ IanMacDonald의 대답과 함께 가서 길을 따라 가야합니다. –

답변

2

CGPath의 요소를 열거하려면 CGPathApply을 사용해야하며 조기 종료를 지원하지 않습니다. 모든 요소를 ​​열거해야합니다.

this answer에서 내 Rob_forEachElementOfCGPath 기능을 잡고,이처럼 사용

점으로 계산 무엇
int numberOfSegmentsInCGPath(CGPathRef path) { 
    __block int count = 0; 
    Rob_forEachElementOfCGPath(path, ^(const CGPathElement *element) { 
     if (element->type != kCGPathElementMoveToPoint) { 
      ++count; 
     } 
    }); 
    return count; 
} 
+0

감사합니다. 그러나 조기 종료에 대한 지원이 없다면 특정 프로젝트에 대해 포인트 수를 유지하는 것이 더 효율적입니다. – 4GetFullOf

1

특별히 효과적인 방법은 없지만 추가 할 때 포인트 수를 추적 할 수 있습니다. 당신이 만들고 싶어하는 경우

@interface MyPath : NSObject 
@property (assign) int pointCount; 
@property (assign) CGPathRef path; 
@end 

당신이 그것을 완벽하게 제어했다 (그리고 다른 사람이 당신의 수를 증가 시키거나 증가없이 경로를 변경에 대해 걱정하고 싶지 않았다), 당신은 읽기 전용 속성을하고있을 수 있는지 객체에 '포인트 추가'기능 ... 좋지는 않지만 ApplyPath보다 효율적입니다.

+0

Im은 cgpathref를 매개 변수로 사용하여 3에 도달 할 때까지 (또는 끝 수가 3이 아닌) cgpathref를 취하는 함수를 더 찾고 있습니다. – 4GetFullOf

+0

을 반환합니다.하지만 이것을 수행하는 방법은 하나 뿐이며 'CGPathApply'를 사용하고'points '를 반복하지만'3 개 이상 '조건을 확인하는 것이 특히 효율적이지 않다고 생각합니다. –