2012-06-30 6 views

답변

5

NSBezierPath는 정확히 어떤 점을 그리는 지 정의하지 않지만 피스를 정의하는 데 필요한 점을 포함합니다. elementAtIndex:associatedPoints: 메서드를 사용하여 경로의 각 벡터 요소에 대한 점을 가져올 수 있습니다. 경로의 각 점을 얻으려면 모든 요소를 ​​반복하고 연관된 점을 얻어야합니다. 직선의 경우이 방법은 끝점을 제공하지만 이전 점을 추적하면 원하는만큼 많은 점을 사용할 수 있습니다.

커브의 경우 곡선을 따라 점을 찾기 위해 커브의 경로를 결정하는 코드를 구현해야합니다. bezierPathByFlatteningPath을 사용하면 경로를 평평하게 만드는 것이 훨씬 간단 할 수 있습니다.이 경로는 모든 곡선이 직선으로 변환 된 새 경로를 반환합니다.

다음은 경로를 평평하게하고 결과의 모든 줄 끝점을 인쇄하는 예입니다. 경로에 긴 직선이 포함되어 있으면 길이에 따라 선을 따라 점을 추가 할 수 있습니다.

NSBezierPath *originalPath; 
NSBezierPath *flatPath = [originalPath bezierPathByFlatteningPath]; 
NSInteger count = [flatPath elementCount]; 
NSPoint prev, curr; 
NSInteger i; 
for(i = 0; i < count; ++i) { 
    // Since we are using a flattened path, no element will contain more than one point 
    NSBezierPathElement type = [flatPath elementAtIndex:i associatedPoints:&curr]; 
    if(type == NSLineToBezierPathElement) { 
     NSLog(@"Line from %@ to %@",NSStringFromPoint(prev),NSStringFromPoint(curr)); 
    } else if(type == NSClosePathBezierPathElement) { 
     // Get the first point in the path as the line's end. The first element in a path is a move to operation 
     [flatPath elementAtIndex:0 associatedPoints:&curr]; 
     NSLog(@"Close line from %@ to %@",NSStringFromPoint(prev),NSStringFromPoint(curr)); 
    } 
} 
+0

감사. elementAtIndex : associatedPoints : 메소드를 인식하지 못했습니다. 나는 의심한다. 내가 bezierpathWithOvalInRect에 의해 만들어진 bezierpath에 경로를 평평하게 한 후에 요소 수를 시도했을 때. 각 요소에 단 하나의 점만 포함 할 수 있다면 17 점을 가진 완전한 타원형을 만들 수 있습니다. 어떻게 가능합니까? – Rakesh

+0

사용 된 타원형 및 평면도의 크기에 따라 다릅니다. 편평함 값을 줄이면 선이 더 정확한 표현을 생성하므로 더 많은 점이 필요합니다. – ughoavgfhw

0

경로가 벡터 기반 이므로 픽셀 기반이 아니기 때문에 아니요. CGContextRef에 경로를 렌더링 한 다음 어떤 픽셀이 설정되어 있는지 확인해야합니다. 그러나 이에 대한 방법은 없습니다.

경로를 따라 직사각형을 이동해야하는 경우 어떻게해야할지 모르겠지만 CALayer을 사용하면됩니다.