gpt4 book ai didi

swift - 如何在 Swift 中获取 UIBezierPath 上的每个 CGPoint

转载 作者:行者123 更新时间:2023-11-30 12:09:59 28 4
gpt4 key购买 nike

image

Problem Image

我想找出 UIBezierPath 路径下的所有 cgpoints,为此我有 3 个点来创建 UIBezier 路径。我已经尝试过下面的代码,但它没有提供准确的结果。请检查所附图片有人可以帮我解决这个问题吗?

提前致谢:)

  func getPathElementsPointsAndTypes() -> ([CGPoint],[CGPathElementType]) {
var arrayPoints : [CGPoint]! = [CGPoint]()
var arrayTypes : [CGPathElementType]! = [CGPathElementType]()
self.forEach { element in
switch (element.type) {
case CGPathElementType.moveToPoint:
arrayPoints.append(element.points[0])
arrayTypes.append(element.type)
case .addLineToPoint:
arrayPoints.append(element.points[0])
arrayTypes.append(element.type)
case .addQuadCurveToPoint:
arrayPoints.append(element.points[0])
arrayPoints.append(element.points[1])
arrayTypes.append(element.type)
arrayTypes.append(element.type)
case .addCurveToPoint:
arrayPoints.append(element.points[0])
arrayPoints.append(element.points[1])
arrayPoints.append(element.points[2])
arrayTypes.append(element.type)
arrayTypes.append(element.type)
arrayTypes.append(element.type)
default: break
}
}
return (arrayPoints,arrayTypes)
}

最佳答案

让我们退后一步。为什么你想要所有这些点?是看是否有人触摸路径的轮廓?如果是这样,请使用 CGPathCreateCopyByStrokingPath创建一个新路径,填充原始路径的位置,然后使用新路径的 containsPoint 方法。简单。

如果你真的想要“所有”点,你必须接受数学上直线和曲线上有无数个点,因此你无法获得所有点。在 iOS 中,点是 CGFloat 对,但实际上仍然有太多点无法拥有“所有”点。然而,您可以在曲线的任何部分获得任意数量的点,因此如果说“路径上的 100 个点”或“路径上的 1000 个点”(或几乎任何您喜欢的整数)将解决您的问题那么这仍然是一个可以解决的问题。

迭代每个路径元素是一个好的开始。

对于每条线,您需要生成线上的“所有”点,这是非常简单的几何图形:计算从起点到终点的向量。以您喜欢的小步长从 0.0 迭代到 1.0。将向量乘以该分数,将其添加到起点,这就是您的点。

对于每条曲线,您都需要一个更复杂的方程,这里有一些伪代码:

function computeCurve(points[], t):
if(points.length==1):
recordPoint(points[0])
else:
newpoints=array(points.size-1)
for(i=0; i<newpoints.length; i++):
newpoints[i] = (1-t) * points[i] + t * points[i+1]
computeCurve(newpoints, t)

要详细了解贝塞尔曲线如何“真正发挥作用”,请查看 https://pomax.github.io/bezierinfo/ (它有伪代码 - 基本上包括我上面抄写的部分,但没有任何东西可以在 Swift 中直接执行)。

对于已在 iOS 上执行此操作的代码,请查看:

https://github.com/CodingMeSwiftly/UIBezierPath-Superpowers

对于 macOS,我做了一个相当小的分支来支持 macOS 上稍微不同的原语集:

https://github.com/stripes/UIBezierPath-Superpowers

他们将为您提供 UIBezierPath(或 NSBezierPath)mx_point(分数:CGFloat)的新方法,让您可以给它一个 0 到 1 的值并获得您感兴趣的点。它还有一个方法可以为您提供路径的总长度,因此如果您不需要“路径上的 100 个点”,而是“路径上的点相距不超过 3 个像素”,您可以使用它来估计步长的速度分数。这只是一个猜测,因为弧的某些部分会比其他部分“移动”得更快。因此,您需要生成每个点,如果它们距离您的使用太远,请后退一点。

祝你好运!

关于swift - 如何在 Swift 中获取 UIBezierPath 上的每个 CGPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46194888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com