tins2021/cube.go

103 lines
2.7 KiB
Go
Raw Permalink Normal View History

package tins2021
import (
"image"
"image/color"
"github.com/llgcode/draw2d/draw2dimg"
"github.com/lucasb-eyer/go-colorful"
"opslag.de/schobers/geom"
)
const hexagonRadius = TextureSize / 2
func Clamp(f float64) float64 {
if f < 0 {
return 0
}
if f > 1 {
return 1
}
return f
}
func drawToGC(gc *draw2dimg.GraphicContext, points ...geom.PointF) {
gc.MoveTo(points[0].XY())
for _, p := range points[1:] {
gc.LineTo(p.XY())
}
gc.Close()
}
func fillStrokeToGC(gc *draw2dimg.GraphicContext, color color.Color, points ...geom.PointF) {
gc.SetStrokeColor(color)
gc.SetFillColor(color)
drawToGC(gc, points...)
gc.FillStroke()
}
func GenerateCube(hexColor string) image.Image {
im := image.NewRGBA(image.Rect(0, 0, 2*hexagonRadius, 2*hexagonRadius))
normal := mustHexColor(hexColor)
h, c, l := normal.Hcl()
light := colorful.Hcl(h, c, Clamp(l+0.1)).Clamped()
dark := colorful.Hcl(h, c, Clamp(l-0.1)).Clamped()
center, points := Hexagon(hexagonRadius)
gc := draw2dimg.NewGraphicContext(im)
fillStrokeToGC(gc, dark, points[2], points[3], points[4], center)
fillStrokeToGC(gc, normal, points[4], points[5], points[0], center)
fillStrokeToGC(gc, light, points[0], points[1], points[2], center)
return im
}
func GenerateHexagon(hexColor string) image.Image {
im := image.NewRGBA(image.Rect(0, 0, 2*hexagonRadius, 2*hexagonRadius))
color := mustHexColor(hexColor)
center, points := Hexagon(hexagonRadius)
gc := draw2dimg.NewGraphicContext(im)
fillStrokeToGC(gc, color, points[2], points[3], points[4], center)
fillStrokeToGC(gc, color, points[4], points[5], points[0], center)
fillStrokeToGC(gc, color, points[0], points[1], points[2], center)
return im
}
func Hexagon(radius float64) (geom.PointF, []geom.PointF) {
points := make([]geom.PointF, 6)
center := geom.PtF(radius, radius)
for i := range points {
a := geom.Pi * (float64(i)/3 + (1. / 6))
points[i] = center.Add(geom.PtF(radius*geom.Cos(a), -radius*geom.Sin(a)))
}
return center, points
}
func GenerateHole(hexColor string) image.Image {
im := image.NewRGBA(image.Rect(0, 0, 2*hexagonRadius, 2*hexagonRadius))
normal := mustHexColor(hexColor)
h, c, l := normal.Hcl()
light := colorful.Hcl(h, c, Clamp(l+0.1)).Clamped()
dark := colorful.Hcl(h, c, Clamp(l-0.1)).Clamped()
center, points := Hexagon(hexagonRadius)
gc := draw2dimg.NewGraphicContext(im)
fillStrokeToGC(gc, dark, points[5], points[0], points[1], center)
fillStrokeToGC(gc, normal, points[1], points[2], points[3], center)
fillStrokeToGC(gc, light, points[3], points[4], points[5], center)
return im
}
func strokeToGC(gc *draw2dimg.GraphicContext, color color.Color, points ...geom.PointF) {
gc.SetStrokeColor(color)
drawToGC(gc, points...)
gc.Stroke()
}