如果我有一个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
来执行此操作,尽管我不完全确定如何操作。