NSBezierPath 객체가있는 경우 그려진 모든 점의 좌표 (x, y)를 가져 오는 방법이 있습니까? 경로를 따라 NSRect를 이동하려고합니다.NSBezierPath 객체의 모든 점의 x, y 좌표를 얻을 수있는 방법이 있습니까?
답변
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));
}
}
감사. elementAtIndex : associatedPoints : 메소드를 인식하지 못했습니다. 나는 의심한다. 내가 bezierpathWithOvalInRect에 의해 만들어진 bezierpath에 경로를 평평하게 한 후에 요소 수를 시도했을 때. 각 요소에 단 하나의 점만 포함 할 수 있다면 17 점을 가진 완전한 타원형을 만들 수 있습니다. 어떻게 가능합니까? – Rakesh
사용 된 타원형 및 평면도의 크기에 따라 다릅니다. 편평함 값을 줄이면 선이 더 정확한 표현을 생성하므로 더 많은 점이 필요합니다. – ughoavgfhw
경로가 벡터 기반 이므로 픽셀 기반이 아니기 때문에 아니요. CGContextRef
에 경로를 렌더링 한 다음 어떤 픽셀이 설정되어 있는지 확인해야합니다. 그러나 이에 대한 방법은 없습니다.
경로를 따라 직사각형을 이동해야하는 경우 어떻게해야할지 모르겠지만 CALayer
을 사용하면됩니다.
NSRect는 '코코아 터치'에 없습니다. 'CGRect'를 원하셨습니까? –