Как выполнить итерацию по массиву координат, чтобы нарисовать CGPath?

#ios #arrays #swift #loops #cgpath

#iOS #массивы #swift #циклы #cgpath

Вопрос:

У нас есть массив координат, и мы хотим выполнить цикл по ним, чтобы нарисовать путь. Вот как это выглядит с жестко заданными значениями:

  func createPath(){
        path.move(to: CGPoint(x: 32.7915055, y: -96.8028408))//1
        path.addLine(to: CGPoint(x: 32.79174845, y: -96.80252195))
        path.addLine(to: CGPoint(x: 32.7919914, y: -96.8022031))//2
        path.addLine(to: CGPoint(x: 32.791501100000005, y: -96.80235195))
        path.addLine(to: CGPoint(x: 32.7910108, y: -96.8025008))//3
        path.addLine(to: CGPoint(x: 32.791301700000005, y: -96.8020985))
        path.addLine(to: CGPoint(x: 32.7915926, y: -96.8016962))//4
        path.addLine(to: CGPoint(x: 32.79154905, y: -96.8022685))
        
    }
  

но мы пытаемся не жестко кодировать, а вместо этого создать функцию, которая принимает массив координат, подобный этому:

  func create(coordinates: [CLLocationCoordinate2D]) {
        for coordinate in coordinates {
            path.move(to: CGPoint(x: coordinate.x, y:coordinate.y))//error
            path.addLine(to: CGPoint(x: coordinate.x, y: coordinate.y))//error
        }
    }
  

Проблема в том, как получить первую координату в массиве для «path.move», а затем использовать дополнительные координаты для использования в части функции «path.AddLine»?

Ответ №1:

перечислите массив и проверьте его индекс:

   for (index, coordinate) in coordinates.enumerated() {
        if index == 0 {
            path.move(to: CGPoint(x: coordinate.longitude, y:coordinate. latitude))
        } else {
            path.addLine(to: CGPoint(x: coordinate.longitude, y: coordinate.latitude))
        }
  }
  

также обратите внимание, что CLLocationCoordinate2D не имеет x nor y но longitude и latitude

Ответ №2:

Для этого есть удобный CGContext.addLines(between:) метод. Вот описание из документов:

Вызов этого удобного метода эквивалентен вызову метода move(to:) с первым значением в массиве точек, а затем вызову метода AddLine(to:) для каждой последующей точки, пока массив не будет исчерпан. После вызова этого метода текущая точка пути является последней точкой в массиве.

Использование:

 let cgPoints = coordinates.map { CGPoint(x: $0.longitude, y: $0.latitude) } 
ctx.addLines(between: cgPoints)