import SwiftUI
struct ContentView: View {
@State private var angleDegrees: Double = 60
var body: some View {
VStack {
EquilateralTriangle(angleDegrees: angleDegrees)
.frame(width: 100, height: 100)
.padding(.top, 100)
Slider(value: $angleDegrees, in: 0...60, step: 1)
.padding(.horizontal)
}
}
}
struct EquilateralTriangle: Shape {
var angleDegrees: Double
var animatableData: Double {
get { angleDegrees }
set { angleDegrees = newValue }
}
func path(in rect: CGRect) -> Path {
let centerX = rect.midX
let centerY = rect.midY
let sideLength = min(rect.width, rect.height) / 2.0
let initialRotationAngle = CGFloat(60 - angleDegrees) * .pi / 180.0
let pointA = CGPoint(x: centerX, y: centerY - sideLength)
let pointB = CGPoint(
x: centerX - CGFloat(sin(initialRotationAngle)) * sideLength,
y: centerY + CGFloat(cos(initialRotationAngle)) * sideLength
)
let pointC = CGPoint(
x: centerX + CGFloat(sin(initialRotationAngle)) * sideLength,
y: centerY + CGFloat(cos(initialRotationAngle)) * sideLength
)
var path = Path()
path.move(to: pointA)
path.addLine(to: pointB)
path.addLine(to: pointC)
path.closeSubpath()
return path
}
}
@main
struct EquilateralTriangleApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}