我在UIBezierPath上放置项目。我希望能够指定这些项目之间的分数。换句话说,沿路径每x个点放置一个项目。
我在这里发现了非常好的干净代码:https://andreygordeev.com/2017/03/13/uibezierpath-closest-point/
有了这个,我放置了这些项目,但它沿路径放置了一定数量的项目,均匀分布在路径的各个部分上。这意味着,与长度为1000点的线段相比,长度为100点的线段将使项目放置得更加接近。
所以,我想找到每个段的长度,然后在引用的代码中使t等于段之间的距离/段的长度。
我为线性段的距离写了这个函数:
/// Calculates distance between points
private func calculateLinearDistance(p1: CGPoint, p2: CGPoint) -> CGFloat {
let width = p1.x - p2.x
let height = p1.y - p2.y
let distance = sqrt(pow(width,2)+pow(height,2))
return distance
}
然后我调整了以下线性段的引用代码:
case .addLineToPoint:
// Line
for i in 0...capacityPerPiece {
let t = CGFloat(i) / CGFloat(capacityPerPiece)
let point = calculateLinear(t: t, p1: startPoint, p2: endPoint)
lookupTable.append(point)
}
为:
case .addLineToPoint:
// Line
var i:CGFloat = 0.0
let distance = calculateLinearDistance(p1: startPoint, p2: endPoint) //new
while (i < distance) {
// let t = CGFloat(i) / CGFloat(capacityPerPiece) replaced
//DEBUG: use variable instead of 7
i = i + 7
let t = i/distance
let point = calculateLinear(t: t, p1: startPoint, p2: endPoint)
lookupTable.append(point)
}
这很棒!
但是,我应该用什么公式来查找.addQuadCurveToPoint和.addCurveToPoint的长度?