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 шт):
Подготовил тестовый проект, где реализовано масштабирование вашего массива точек (я сдвинул их, вычтя 1000 из всех координат, чтобы уместить на экране).
Алгоритм такой - вычисляем для массива его границы по самым внешним точкам, получая выпуклый многоугольник, затем вычисляем для него центр, и затем уже на основе массива точек и полученного центра делаем масштабирование.
Проект на Swift, но вычисления я оставил на С++, для него сделал обертку на Objective C для конвертации данных между C++ и Swift
