我在一些坐标系统,我想绘制CGPath。这样做涉及旧的坐标系缩放到Context的一个。为此,我使用CGContextConcatCTM()这确实改变所有的点,因为它应该。但是,因为它是一个缩放操作,水平/垂直线宽度得到改变。例如。在y方向的10中x方向上的尺度,但1将导致垂直线为10倍厚为水平的。有没有一种方法,以保持易用性转换矩阵(例如CGAffineTransform)的,但同时不结垢线宽,例如像CGPathApplyAffineTransformToPoints函数?

干杯

MrMage

有帮助吗?

解决方案

可以通过在一个路径中的元件使用CGPathApply进行迭代。这不仅仅是一个班轮更复杂一点,但如果你在一个简单的辅助功能包起来,这可能是对你有用。这里是一个创建一个新的路径和变换它的版本:

typedef struct {
    CGMutablePathRef path;
    CGAffineTransform transform;
} PathTransformInfo;

static void
PathTransformer(void *info, const CGPathElement *element)
{
    PathTransformInfo *transformerInfo = info;

    switch (element->type) {
        case kCGPathElementMoveToPoint:
            CGPathMoveToPoint(transformerInfo->path, &transformerInfo->transform,
                              element->points[0].x, element->points[0].y);
            break;

        case kCGPathElementAddLineToPoint:
            CGPathAddLineToPoint(transformerInfo->path, &transformerInfo->transform,
                                 element->points[0].x, element->points[0].y);
            break;

        case kCGPathElementAddQuadCurveToPoint:
            CGPathAddQuadCurveToPoint(transformerInfo->path, &transformerInfo->transform,
                                      element->points[0].x, element->points[0].y,
                                      element->points[1].x, element->points[1].y);
            break;

        case kCGPathElementAddCurveToPoint:
            CGPathAddCurveToPoint(transformerInfo->path, &transformerInfo->transform,
                                  element->points[0].x, element->points[0].y,
                                  element->points[1].x, element->points[1].y,
                                  element->points[2].x, element->points[2].y);
            break;
        case kCGPathElementCloseSubpath:
            CGPathCloseSubpath(transformerInfo->path);
            break;
    }
}

要使用它,你会做(这是我把一个辅助函数内的部分):

    PathTransformInfo info;
    info.path = CGPathCreateMutable();
    info.transform = CGAffineTransformMakeScale(2, 1);

    CGPathApply(originalPath, &info,  PathTransformer);

转化的路径是在info.path在这一点上。

其他提示

当您添加路径做了变换,但随后删除您的路径冲程前的变换。取而代之的是:

CGContextSaveGState(ctx);
CGContextScaleCTM(ctx, 10, 10);   // scale path 10x

CGContextAddPath(ctx, somePath);

CGContextSetStrokeColorWithColor(ctx, someColor);
CGContextSetLineWidth(ctx, someWidth);   // uh-oh, line width is 10x, too
CGContextStrokePath(ctx);

CGContextRestoreGState(ctx);      // back to normal

这样做:

CGContextSaveGState(ctx);
CGContextScaleCTM(ctx, 10, 10);   // scale path 10x

CGContextAddPath(ctx, somePath);

CGContextRestoreGState(ctx);      // back to normal

CGContextSetStrokeColorWithColor(ctx, someColor);
CGContextSetLineWidth(ctx, someWidth);
CGContextStrokePath(ctx);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top