iphone - 如何获取 CGPath 曲线或四边形曲线中的所有点

标签 iphone cocoa core-animation core-graphics bezier

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

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

如果没有,您是否有任何其他解决方案来以数学方式检索曲线中的所有点。

提前致谢, 瓦姆希

最佳答案

您可以使用三次贝塞尔曲线的 wykobi C++ 库例程来完成此操作。 Wykobi 的库还支持二次贝塞尔曲线。

当然,正如有人指出的那样,您并不想要所有的点(虽然并非不可能,但这只会花费无限的时间:)。 Wykobi 可以轻松获得一定数量的点 - 如果您的起点、c1、c2 和终点(其中 c1、c2 是控制点)与提供给 CGContextAddCurveToPoint 的点完全相同,那么这些点将完美地位于在核心图形绘制的线上 - 因此您可以执行诸如在路径上的多个点绘制图案之类的操作。

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

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

我创建了一个 C++ 类 WPoint 作为 wykobi 点和 CGPoints 之间的桥梁(C++ 的乐趣!)。这里有一些代码(没有 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

关于iphone - 如何获取 CGPath 曲线或四边形曲线中的所有点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/841111/

相关文章:

iphone - iOS -> .NET WebService 身份验证问题

macos - 如何将行从 NSOutlineView 拖动到 NSTableview

objective-c - Xcode:将图像设置为 Touch Bar 上的按钮(适用于新 MacBook Pro)

iphone - iOS 核心动画 : CALayer bringSublayerToFront?

cocoa - NSTextField 动画

ios - Swift - 语音转文本并保存音频文件

iphone - 访问未知的setter方法

ios - 如何使用动画在 x 方向上延长 UISearchBar?

iphone - 如何使用线程为每一行自动调用一个函数

cocoa - 即使使用 NS_BUILD_32_LIKE_64 宏也无法设置边界