swift Увеличить рисуемую фигуру во все стороны

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

Проблема в том, что я немного не верно рассчитал сами точки и между внутренней границей квадрата (на самом изображении) и рисуемой мной линией (по точкам) остается пространство. Можно ли как-то сместить на пару позиций массив точек (CGPoint), что бы рисуемая мной линия и внутренняя граница квадрата соприкасались ? или тут только нужно заново определить новый массив точек, что бы уже соприкасались ?

Что бы не пересчитывать точки, я пытался задать, к рисуемой мной линиям, обводку (Stroke color) (я пытался тем самым добить пространство между моей линией и границей квадрата) и все было бы ок, но вот обводка на 50% с внутренней стороны моей линии и у меня не получается сделать ее только с внешней. Мб вы поможете мне с этим

func draw(points: [CGPoint], image: UIImage) -> UIImage? {
    UIGraphicsBeginImageContext(image.size)
    image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))

    guard let context = UIGraphicsGetCurrentContext() else { return nil }
    context.setLineWidth(5.0)

    context.beginPath()
    var oldPoint = points[0]
    context.move(to: oldPoint)
    for index in 1...points.count-1 {
        context.addLine(to: points[index] as CGPoint)
        oldPoint = points[index] as CGPoint
    }
    context.addLine(to: points[0])
          
    context.closePath()
    
    UIColor.init(rgb: 0xe1dfdf).setStroke()
    UIColor.red.withAlphaComponent(0.4).setFill()
    
    context.drawPath(using: .fillStroke)
    context.fillPath()
    
    guard let resultImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
    
    UIGraphicsEndImageContext()
    return resultImage
}

Ответы (1 шт):

Автор решения: schmidt9

Подготовил тестовый проект, где реализовано масштабирование вашего массива точек (я сдвинул их, вычтя 1000 из всех координат, чтобы уместить на экране).

Алгоритм такой - вычисляем для массива его границы по самым внешним точкам, получая выпуклый многоугольник, затем вычисляем для него центр, и затем уже на основе массива точек и полученного центра делаем масштабирование.

Проект на Swift, но вычисления я оставил на С++, для него сделал обертку на Objective C для конвертации данных между C++ и Swift

введите сюда описание изображения

→ Ссылка