48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
rl "github.com/gen2brain/raylib-go/raylib"
|
|
)
|
|
|
|
type SierpinskiArrow struct {
|
|
dirty bool
|
|
}
|
|
|
|
func (s *SierpinskiArrow) Draw(env *Env) {
|
|
rl.Translatef(float32(env.GetGraphicsWidth())/2.0, float32(env.GetGraphicsHeight())/2.0, 0)
|
|
rl.ClearBackground(rl.NewColor(0, 0, 0, 0))
|
|
sierpinskiArrow(env, int(env.Ports["sierpinskiArrowDepth"]), env.Ports["sierpinskiArrowLength"])
|
|
}
|
|
|
|
func (s *SierpinskiArrow) Update(_ *Env) {
|
|
s.dirty = true
|
|
}
|
|
|
|
func (s *SierpinskiArrow) IsDirty() bool {
|
|
return s.dirty
|
|
}
|
|
|
|
func sierpinskiArrow(env *Env, order int, length float64) {
|
|
if order == 0 {
|
|
curve(env, order, length, env.Ports["sierpinskiArrowAngle"])
|
|
} else {
|
|
rl.Rotatef(float32(env.Ports["sierpinskiArrowAngle"]), 0, 0, 1)
|
|
curve(env, order, length, -env.Ports["sierpinskiArrowAngle"])
|
|
}
|
|
}
|
|
|
|
func curve(env *Env, order int, length float64, angle float64) {
|
|
if order == 0 {
|
|
len := int32(length)
|
|
rl.SetLineWidth(4)
|
|
rl.DrawLine(0, 0, len, 0, rl.RayWhite)
|
|
rl.Translatef(float32(length), 0, 0)
|
|
} else {
|
|
curve(env, order-1, length/2, -angle)
|
|
rl.Rotatef(float32(angle), 0, 0, 1)
|
|
curve(env, order-1, length/2, angle)
|
|
rl.Rotatef(float32(angle), 0, 0, 1)
|
|
curve(env, order-1, length/2, -angle)
|
|
}
|
|
}
|