我使用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/