如何获得CGPath曲线或四曲线中的所有点?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我已经使用该方法制作了四条曲线路径CGPathAddQuadCurveToPoint。我完美地获得了路径。但是,我想知道所有参与路径的坐标点。

有没有办法检索路径中的所有坐标点?

提问于
用户回答回答于

使用CGContextSetLineDash

此功能的目的是创建一条虚线,但你可以使用它来获取更小的线段。每个细分的起点可以被视为点。

CGSize bbSize = CGPathGetBoundingBox(path).size;
UIGraphicsBeginImageContext(bbSize);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx, 1.0);
CGContextAddPath(ctx, path);
CGContextSetLineDash(ctx, phase, lengths, count);
CGContextReplacePathWithStrokedPath(ctx);
result = CGContextCopyPath(ctx);
UIGraphicsEndImageContext();
用户回答回答于

你可以使用wykobi C ++库例程来执行三次贝塞尔曲线。Wykobi的库也支持二次贝塞尔曲线。

参见:http : //www.codeproject.com/Articles/22568/Computational-Geometry-C-and-Wykobi

另外,在我开始使用wykobi之后,我听说有一个类似的,甚至更好的库,它是Boost的一部分,但还没有检查出它。

我创建了一个C ++类WPoint,作为wykobi点和CGPoints(C ++ fun!)之间的桥梁。这里有一些代码(没有WPoint,但你可以想象它和CGPoint的布局完全相同,所以如果你做了正确的投影,你可以很容易地进行转换。

        NSMutableArray* result = [[NSMutableArray alloc] init];
        wykobi::cubic_bezier<CGFloat,2> bezier;
        bezier[0] = (WPoint)p1;  // start point, in CG we did a CGMoveToPoint
        bezier[1] = (WPoint)b1i; // control 1
        bezier[2] = (WPoint)b2i; // control 2
        bezier[3] = (WPoint)p2;  // end point

        std::vector<WPoint> point_list;
        int numPoints = p2.dist(p3) * pointDensity;
        // *** here's the magic ***
        wykobi::generate_bezier(bezier,std::back_inserter(point_list), numPoints);

        for (int i=0; i<numPoints; i++) {
            CGPoint p = (CGPoint)(point_list[i]);
            [result addObject:[NSValue valueWithCGPoint:p]];
        }

// result has your points!

以下是Boost几何库的链接:http : //www.boost.org/doc/libs/1_47_0/libs/geometry/doc/html/geometry/introduction.html

扫码关注云+社区