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



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

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));
    }
}

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

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

相关内容

  • 没有找到相关文章

最新更新