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

Posted

技术标签:

【中文标题】在 cgPath 上的两个坐标之间添加中点【英文标题】:Add the middle point between two coordinates on a cgPath 【发布时间】:2020-08-31 18:14:29 【问题描述】:

我们有一个函数基于 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))
        
    

我们还有一个函数可以计算两个 CGPoints 之间的中点:

   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 分吗?

【问题讨论】:

什么是“每边得到四分”?你的意思是你希望你把边画成三个同方向的直线段,而不是一个直线段? 我正在尝试画一条直线,但得到了那条线上的点,我在问题中添加了一些代码,可能会更清楚一点。 你没有回答我的问题,即最终目标是什么。你不想仅仅“得到那条线上的点”。你想用加分一些事情,而我正试图找出它是什么。看起来你想用它们做的是画。我们真正想在这里画什么? 【参考方案1】:

您的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 有一个特殊的算法,例如见***.com/questions/10559219/…

以上是关于在 cgPath 上的两个坐标之间添加中点的主要内容,如果未能解决你的问题,请参考以下文章

两个坐标列表的欧几里得距离矩阵

qt折线图只显示两条线

python输出折线图中点的坐标值怎么算

c语言关于求“已知坐标的两点之间距离的距离”的问题

调整 UIView 的大小以适应 CGPath

添加xy坐标生成面要素-建模方式实现