Skip to content

Instantly share code, notes, and snippets.

@Dev1an
Last active July 17, 2021 20:16
Show Gist options
  • Save Dev1an/ec7a9125d80a08b61dbff9fb5c784a31 to your computer and use it in GitHub Desktop.
Save Dev1an/ec7a9125d80a08b61dbff9fb5c784a31 to your computer and use it in GitHub Desktop.
import SwiftUI
// Include this CGPoint extension: https://gist.github.com/Dev1an/7973cee9d960479b35b705f88b7f38c4
public struct RegularPolygon: Shape {
let corners: [CGPoint]
/**
Create a polygon shape with provided number of sides.
- Parameter sides: number of sides
*/
public init(sides: Int) {
assert(sides > 2, "A polygon must have more than 2 sides")
corners = .init(unsafeUninitializedCapacity: sides) { list, count in
var corner = list.baseAddress!
let endCorner = corner.advanced(by: sides)
let angleIncrement = CGFloat.pi * 2 / CGFloat(sides)
var angle = CGFloat.zero
while corner < endCorner {
corner.initialize(to: [ cos(angle), sin(angle) ] )
corner = corner.advanced(by: 1)
angle += angleIncrement
}
count = sides
}
}
public func path(in rect: CGRect) -> Path {
var path = Path()
if let start = corners.first {
let center = rect.origin + [rect.width, rect.height] / 2
let diameter = min(rect.width, rect.height)
let radius = diameter / 2.0
path.move(to: start * radius + center)
for unitCorner in corners.dropFirst() {
path.addLine(to: unitCorner * radius + center)
}
path.closeSubpath()
}
return path
}
}
struct RegularPolygon_Previews: PreviewProvider {
static var previews: some View {
VStack {
ForEach(3..<9, content: RegularPolygon.init)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment