Last active
July 17, 2021 20:16
-
-
Save Dev1an/ec7a9125d80a08b61dbff9fb5c784a31 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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