- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
简单地说,我正在寻找可在 iOS 上使用的与 NSBezierPath 的 -bezierPathByFlatteningPath
等效的方法。这对我来说是直接处理 CGPath 的函数还是 UIBezierPath 上的方法并不重要,因为两者可以轻松地来回转换。 CGPath Reference 都不是也不是 UIBezierPath Class Reference指示任何此类功能或方法的存在。
此外:我知道 CGPath 的 CGPathApply
函数,但我缺乏时间和技能来通过遍历 CGPathApplierFunction 中的路径元素来实现我自己的展平算法
。我正在寻找对此的现有解决方案 - 应用程序函数、UIBezierPath 上的类别等。肯定存在一个。
最佳答案
Erica Sadun 提供了一组有用的函数来处理 UIBezierPath 和 CGPathRef。
此代码用于 this book .
她没有提供 CGPathRef 扁平化的实现,但可以使用可在此处找到的函数轻松完成: https://github.com/erica/iOS-Drawing/blob/master/C05/Quartz%20Book%20Pack/Bezier/BezierFunctions.m
特别是,这些函数将有助于离散化非线性贝塞尔曲线段:
float CubicBezier(float t, float start, float c1, float c2, float end)
float QuadBezier(float t, float start, float c1, float end)
CGPoint CubicBezierPoint(CGFloat t, CGPoint start, CGPoint c1, CGPoint c2, CGPoint end);
CGPoint QuadBezierPoint(CGFloat t, CGPoint start, CGPoint c1, CGPoint end);
所以基本上,初始化一个空的 CGMutablePathRef,并且对于原始路径中的每个 CGPath 元素,如果它是线性的则复制它,或者根据贝塞尔曲线段的程度将其离散化。
您可能还想应用 Ramer–Douglas–Peucker algorithm删除不必要的点。
您也可以直接使用:- (NSArray *) interpolatedPathPoints
它返回一个 NSArray 点,可用于构建路径的近似值。该算法是幼稚的,因此您必须在这种情况下简化结果,例如,三次贝塞尔曲线路径是线性的(如果控制点对齐);和以前一样,Ramer-Douglas-Peucker 算法完成了这项工作。
这是实际离散化的样子。代码不是自包含的,您必须使用所有依赖项。
- (NSArray *) interpolatedPathPoints
{
NSMutableArray *points = [NSMutableArray array];
BezierElement *current = nil;
int overkill = 3;
for (BezierElement *element in self.elements)
{
switch (element.elementType)
{
case kCGPathElementMoveToPoint:
case kCGPathElementAddLineToPoint:
[points addObject:[NSValue valueWithCGPoint:element.point]];
current = element;
break;
case kCGPathElementCloseSubpath:
current = nil;
break;
case kCGPathElementAddCurveToPoint:
{
for (int i = 1; i < NUMBER_OF_BEZIER_SAMPLES * overkill; i++)
{
CGFloat percent = (CGFloat) i / (CGFloat) (NUMBER_OF_BEZIER_SAMPLES * overkill);
CGPoint p = CubicBezierPoint(percent, current.point, element.controlPoint1, element.controlPoint2, element.point);
[points addObject:[NSValue valueWithCGPoint:p]];
}
[points addObject:[NSValue valueWithCGPoint:element.point]];
current = element;
break;
}
case kCGPathElementAddQuadCurveToPoint:
{
for (int i = 1; i < NUMBER_OF_BEZIER_SAMPLES * overkill; i++)
{
CGFloat percent = (CGFloat) i / (CGFloat) (NUMBER_OF_BEZIER_SAMPLES * overkill);
CGPoint p = QuadBezierPoint(percent, current.point, element.controlPoint1, element.point);
[points addObject:[NSValue valueWithCGPoint:p]];
}
[points addObject:[NSValue valueWithCGPoint:element.point]];
current = element;
break;
}
}
}
return points;
}
代码属于 Erica Sadun。有关完整的实现,请参见此处:https://github.com/erica/iOS-Drawing
Rob Napier 还在 iOS 6 Pushing the limits 中写了关于贝塞尔曲线的文章, 第 26 章花哨的文本布局。他并没有试图展平一个完整的 UIBezierPath,只有一个用四个点定义的立方贝塞尔路径,但实际上这完全是一回事(离散化贝塞尔路径)此外,您可能会发现这篇文章很有趣:http://robnapier.net/faster-bezier
关于ios - 展平 CGPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18858011/
我在 CAShapeLayer 上执行了一些 CGPath(一个带有两个圆圈的多边形)。 我可以像这样修剪/减去路径吗? 最佳答案 无需计算,可以在绘制时使用 kCGBlendModeClear 获得
我试图将 UITextField 的左上角和左下角四舍五入。这是我正在使用的代码: override func viewDidLayoutSubviews() { super.viewDidL
我有一个代表椭圆的 SKShape 节点。玩家被放置在基于椭圆 CGPath 的贝塞尔路径的当前点上: 我有两个玩家节点可以执行的操作。玩家可以顺时针或逆时针沿着路径行驶。 rotateCounter
我在 CGPath.h 头文件中找到了它。我很好奇这个 const 的作用是什么? typedef struct CGPath *CGMutablePathRef; typedef const str
我正在使用 CGPath 绘制形状并在绘制后添加到 CAShapeLayer。我正在使用 CGPathGetPathBoundingBox() 获取框架(此框架将设置为 CAShapeLayer)但它
下面的代码有点问题。 points 数组是由寻路算法提供的一组点,它给出了在下面的方法中创建的开始和结束 CGPoints 之间的最短路径。调试此代码后,我知道它有效。 我认为是 CGPath 导致了
我已经研究了一段时间了,作为一个初学者,我似乎无法完成它。我想要做的是采用简单的渐变,并用它来描边 CGPath。我尝试使用 CGContextSetStokePattern 和 PNG 线的宽度和一
我有一个 UIView,其中包含一个带有不规则大小切片的“饼图”,我需要它们是可点击的区域。通过大量的反复试验,我写了一个方法来制作馅饼,但现在我不知道如何将这些切片分成区域。目前这个方法返回 voi
我想创建一个类别来“扩展”CGPath 的“类别”并添加更多功能。因为 CGPath 不是 ObjectiveC 的常规对象,我该怎么做? 请原谅我对c/c++的了解不足 最佳答案 很简单,您只需编写
我正在使用 Swift 制作游戏,并且我有一个任意角度的 CGPath。现在让我们假设它始终是一条直线。 我想创建的是这样的: 我已经尝试了一种非常简单的方法,即以黑色的粗线宽进行描边,复制路径,然后
是否可以在创建时绘制 CGPath(添加每条线时)而不是立即绘制点的整个路径?我希望看到在添加线条时绘制的路径。 此外,是否可以一次绘制一条线作为较大路径的一部分,而不是每次都在自身上绘制一条额外的线
我正在尝试找到一种方法来创建随机闭合平滑路径(CGPath 或 UIBezierPath)。我读过 De Casteljau's algorithm以及其他关于贝塞尔路径的文章,但它似乎不符合我试图实
简单地说,我正在寻找可在 iOS 上使用的与 NSBezierPath 的 -bezierPathByFlatteningPath 等效的方法。这对我来说是直接处理 CGPath 的函数还是 UIBe
更新 我通过使用 OpenGL 绘制所有内容来绕过 CG 的限制。仍然存在一些问题,但到目前为止,它的工作速度要快得多。 一些有趣的点: GLKView :这是一个特定于 iOS 的 View ,它对
我正在尝试绘制一个 CGPath,它的笔划有一个笔划。 基本上我想使用 CGPath 画一条线。然后我想返回并在最后一个 CGPath 的两侧画线,使其具有轮廓效果。 这条线可以以任何方式弯曲和转动,
如何删除路径的某些部分?我在屏幕上绘制了一条路径,现在假设我想删除 1/3: 我试过这样做(路径是我的原始路径,cPath是将被剪切的副本): let sizePath = CGPathGetBoun
我的新游戏 Sprite 有问题... 我的“汽车”在第一圈完美地沿着赛道行驶,但从那时起,它似乎在每圈结束时都会发生偏移。有人能告诉我我做错了什么吗? - (void)createSceneCont
我需要一些示例代码,我可以在其中为曲线/圆弧路径设置动画,该路径应该绘制一个完整的圆作为动画? 我们将不胜感激。 谢谢,周六 最佳答案 更新:意识到这个问题有更好的解决方案。只需创建一个圆形路径并将
我意识到在 iPhone 上让图像遵循预先确定的路径并不是很困难(请参阅 here ),但我想知道图像是否有可能仅遵循部分的路径。例如,如果我有一条从 A 到 B 的路径,如何使图像仅以动画形式呈现朝
假设我有一个 CGPath,它是 CGContextRef 中的一个圆圈。我想做的是用颜色填充路径的反面。下面演示了其中圆圈是当前绘制的路径,我想用颜色填充圆圈的反面,留下一个空洞: 最佳答案 首先将
我是一名优秀的程序员,十分优秀!