2

是否有任何核心或其他框架方法来返回表示路径对象的填充部分的某种类型的 CGPath 或集合?

我正在寻找基本上与CGPathCreateCopyByStrokingPath相反的东西。

在一篇关于低级文本渲染的文章的帮助下,我能够想出一个代表字母表中每个字母的路径。

问题是路径是字母的轮廓,而我真正想要的是一条仅代表字母填充部分而不是笔划的路径。例如,字母“A”将仅包含 3 个不同的行。

我目前正在尝试使用类似于过于复杂的 16 段显示的类来解决这个问题。以下是该工作的一些示例代码,供有兴趣的人使用:

const NSUInteger segmentsPerDimension = 4;
const CGFloat oneOverTheNumberOfSegments = 1.0 / segmentsPerDimension;

@implementation PathSegments

- (instancetype)initWithRect:(CGRect)rect {
    self = [super init];
    [self setSegmentBounds:rect];
    _segments = [[NSMutableArray alloc] init];
    ...
    [self addVerticalSegments];
    ...
    return self;
}

- (void)addVerticalSegments {
    for (NSUInteger i = 0; i <= segmentsPerDimension; i++) {
        [self createColumnSegmentsForRow:i];
    }
}

- (void)createColumnSegmentsForRow:(NSUInteger)row {
    for (NSUInteger i = 0; i < segmentsPerDimension; i++) {
        CGFloat x = _segmentBounds.size.width * oneOverTheNumberOfSegments * row;
        CGFloat yEnd = _segmentBounds.size.height * oneOverTheNumberOfSegments * i;
        CGFloat yStart = _segmentBounds.size.height * oneOverTheNumberOfSegments * (i + 1);
        [self addLineSegmentWithXStart:x YStart:yStart XEnd:x YEnd:yEnd];
    }
}
...
@end
4

1 回答 1

0

我已经确定返回路径的填充部分没有意义。虽然可以通过填充轮廓以绘制圆形、矩形或自定义形状的方式定义路径,但将填充部分复制到另一条路径将是不明确的,因为它与您开始使用的路径相同。

然后将分段路径组合成一条完整路径GPathAddPath(...)似乎是继续这条路径的方法。使用一系列线条和曲线,您可以滚动自己的字母形状。

基于您定义了一组点以用作路径段的假设的片段:

_generatedSegmentPath = CGPathCreateMutable();
CGMutablePathRef subPath = CGPathCreateMutable();

...

if (CGPathIsEmpty(subPath)) {
    CGPoint start = [[points objectAtIndex:startIndex] CGPointValue];
    CGPathMoveToPoint(subPath, nil, start.x, start.y);
}

if (points.count == 2) {
    CGPoint point = [[points objectAtIndex:startIndex + indexChange] CGPointValue];
    CGPathAddLineToPoint(subPath, nil, point.x, point.y);
}
else {
    CGPoint controlPoint = [[points objectAtIndex:startIndex + indexChange] CGPointValue];
    CGPoint endPoint = [[points objectAtIndex:startIndex + (2 * indexChange)] CGPointValue];
    CGPathAddQuadCurveToPoint(subPath, nil, controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
}

然后将子路径组合在一起:

CGPathAddPath(_generatedSegmentPath, nil, subPath);
于 2015-06-11T00:55:34.937 回答