5

如果我有一个NSBezierPath对象,有没有办法获取所有绘制点的坐标(x,y)?我想NSRect沿着路径移动。

4

2 回答 2

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));
    }
}
于 2012-06-30T21:09:56.827 回答
-1

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

但是,如果您需要沿路径移动一个矩形,您可以使用 aCALayer来执行此操作,尽管我不完全确定如何操作。

于 2012-06-30T21:01:36.960 回答