mazesolver/internal/outputmaze/outputmaze.go

71 lines
1.7 KiB
Go
Raw Normal View History

2025-01-31 15:50:32 -07:00
package outputmaze
import (
"errors"
"image"
"image/color"
"image/png"
2025-01-31 21:40:21 -07:00
"math"
2025-01-31 15:50:32 -07:00
getMaze "mazesolver/internal/getmaze"
"os"
)
func EditMaze(points []getMaze.Point, oldPath, newPath string) (string, error) {
imagereader, err := os.Open(oldPath)
if err != nil {
return "", err
}
image, err := png.Decode(imagereader)
if err != nil {
return "", err
}
2025-01-31 21:40:21 -07:00
for n, v := range points {
var h float64 = (float64(1) - (((float64(n)) / (float64(len(points)))))) / float64(1.1)
r, g, b := hueToRGB(h)
updateColor(image, v, color.RGBA{uint8(r * 255), uint8(g * 255), uint8(b * 255), 255})
2025-01-31 15:50:32 -07:00
}
f, err := os.Create(newPath)
if err != nil {
return "", err
}
png.Encode(f, image)
return newPath, nil
}
type Changeable interface {
Set(x, y int, c color.Color)
}
func updateColor(image image.Image, p getMaze.Point, color color.Color) error {
2025-02-01 11:08:10 -07:00
psize := getMaze.DeterminePixelSize(image)
for i := p.Y * psize; i < p.Y * psize + psize; i++ {
for ii := p.X * psize; ii < p.X * psize + psize; ii++ {
2025-01-31 15:50:32 -07:00
if cimg, ok := image.(Changeable); ok {
cimg.Set(ii, i, color)
} else {
return errors.New("Image not changeable")
}
}
}
return nil
}
2025-01-31 21:40:21 -07:00
func hueToRGB(h float64) (float64, float64, float64) {
kr := math.Mod(5+h*6, 6)
kg := math.Mod(3+h*6, 6)
kb := math.Mod(1+h*6, 6)
r := 1 - math.Max(min3(kr, 4-kr, 1), 0)
g := 1 - math.Max(min3(kg, 4-kg, 1), 0)
b := 1 - math.Max(min3(kb, 4-kb, 1), 0)
return r, g, b
}
func min3(a, b, c float64) float64 {
return math.Min(math.Min(a, b), c)
}