如果我有一个NSBezierPath对象,有没有办法得到绘制的所有点的坐标(x,y)。我想在路径上移动NSRect。
答案 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
来做这个,虽然我不完全确定如何。