使用Swift为使用.addQuadCurveToPoint和.addCurveToPoint创建的段的cgPath段的长度?

时间:2017-07-07 19:44:04

标签: swift uibezierpath cgpath calculus quadratic

我在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的长度?

0 个答案:

没有答案