在cgPath上添加两个坐标之间的中间点

3
我们有一个函数,根据一个CLLocationCoordinate2D数组创建路径,该数组包含4个坐标,将创建一个正方形形状的路径:
func createPath(coordinates: [CLLocationCoordinate2D]) {
    for (index, coordinate) in coordinates.enumerated() {
        if index == 0 {
            path.move(to: CGPoint(x: coordinate.latitude, y:coordinate.longitude))
        } else {
            path.addLine(to: CGPoint(x: coordinate.latitude, y: coordinate.longitude))
        }
    }
}

我们还有一个计算两个CGPoint之间中间点的函数:
   func getMiddlePoint(firstPoint: CGPoint, secondPoint: CGPoint) -> CGPoint {
        
        var middlePoint = CGPoint()
        
        middlePoint.x = (firstPoint.x + secondPoint.x)/2
        middlePoint.y = (firstPoint.y + secondPoint.y)/2
        return middlePoint
    }

我们想要的是每边获得四个点,然后移动到下一边。我尝试将函数组合起来,但它返回大约90个点。
func createPath(coordinates: [CLLocationCoordinate2D]) {
    for (index, coordinate) in coordinates.enumerated() {
        if index == 0 {
            path.move(to: CGPoint(x: coordinate.latitude, y:coordinate.longitude))
        } else {
            path.addLine(to: CGPoint(x: coordinate.latitude, y: coordinate.longitude))//get the first point
            path.addLine(to:  getMiddlePoint(firstPoint: CGPoint(x: coordinate.latitude, y: coordinate.longitude), secondPoint: CGPoint(x: coordinate.latitude, y: coordinate.longitude))) // get the middle point
        }
    }
}

这是如果坐标是硬编码的情况下的外观,每个边返回2个点:
func createPath(){
    path.move(to: CGPoint(x: 32.7915055, y: -96.8028408))//1
    path.addLine(to: CGPoint(x: 32.79174845, y: -96.80252195))//midpoint between 1 and 2
    path.addLine(to: CGPoint(x: 32.7919914, y: -96.8022031))//2
    path.addLine(to: CGPoint(x: 32.791501100000005, y: -96.80235195))////midpoint between 2 and 3
    path.addLine(to: CGPoint(x: 32.7910108, y: -96.8025008))//3
    path.addLine(to: CGPoint(x: 32.791301700000005, y: -96.8020985))//midpoint between 3 and 4
    path.addLine(to: CGPoint(x: 32.7915926, y: -96.8016962))//4
    path.addLine(to: CGPoint(x: 32.79154905, y: -96.8022685))//midpoint between 4 and 1
    
}

任何想法如何每边只获得4个点?

每边得到四个点是什么意思?你是不是希望将这条边画成三条同方向的直线段,而不是一条直线段? - matt
我正在尝试绘制一条直线,但是想要获取该直线上的点。我在问题中添加了一些额外的代码,希望能更清楚地解释。 - SwiftyJD
你没有回答我的问题,也就是说,最终目标是什么。你不仅仅想要“得到那条线上的点数”。你想要用这些额外的点数来做一些事情,而我正试图弄清楚这是什么。看起来你想要用它们来绘图。我们真正想要绘制的是什么呢? - matt
1个回答

0
你的 path.addLine 语句是颠倒的。首先你必须添加中点,然后是下一个点。此外,你的 getMiddlePoint 函数被调用两次使用了相同的点。
以不同的方式书写:
var prevPoint: CGPoint?

for coordinate in coordinates {
    let point = CGPoint(x: coordinate.latitude, y: coordinate.longitude)

    if let prevPoint = prevPoint {
       path.addLine(to: getMiddlePoint(firstPoint: prevPoint, secondPoint: point))
       path.addLine(to: point)
    } else {
       path.move(to: point)
    }

    prevPoint = point
}

请注意,GPS坐标是球面坐标,通常中点的计算方法与平面上的不同。

那么,计算中点的好方法是什么? - SwiftyJD
@SwiftyJD 这里有一个特殊的算法,例如可以参考 https://dev59.com/KGkv5IYBdhLWcg3wfA4P - Sulthan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接