有没有办法获取NSBezierPath对象的所有点的x,y坐标?

时间:2012-06-30 20:55:05

标签: objective-c macos cocoa drawing nsbezierpath

如果我有一个NSBezierPath对象,有没有办法得到绘制的所有点的坐标(x,y)。我想在路径上移动NSRect。

2 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分:0)

不,因为路径是基于矢量的,而不是基于像素的。您必须在CGContextRef中渲染路径,然后检查从中设置了哪些像素。但是没有内置的方法。

但是,如果你需要沿着路径移动一个矩形,你可以使用CALayer来做这个,虽然我不完全确定如何。