与 CGPathCreateCopyByStrokingPath 相反?

Opposite of CGPathCreateCopyByStrokingPath?

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

我正在寻找与 CGPathCreateCopyByStrokingPath.

基本相反的东西

low-level-text-rendering 上的一篇文章的帮助下,我能够想出一条代表字母表中每个字母的路径。

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

我目前正在尝试使用 class 来解决这个问题,它的作用很像一个过于复杂的 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

我确定 return 路径的填充部分没有意义。虽然路径可以定义为通过填充轮廓绘制圆形、矩形或自定义形状,但将填充部分复制到另一条路径会产生歧义,因为它与您开始时使用的路径完全相同。

然后使用 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);