generated map is now scalable

This commit is contained in:
Dawid Wysokiński 2020-06-23 14:19:45 +02:00
parent b5421f3c70
commit a749d8e0ba
3 changed files with 42 additions and 5 deletions

View File

@ -3,9 +3,12 @@ package generator
import (
"fmt"
"image"
"image/draw"
"image/png"
"io"
"github.com/nfnt/resize"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/models"
)
@ -31,6 +34,9 @@ type Config struct {
BackgroundColor string
GridLineColor string
ContinentNumberColor string
Scale float32
CenterX int
CenterY int
}
func (cfg *Config) init() {
@ -46,6 +52,18 @@ func (cfg *Config) init() {
if cfg.MapSize <= 0 {
cfg.MapSize = defaultMapSize
}
if cfg.Scale <= 0 {
cfg.Scale = 1
}
if cfg.CenterX <= 0 {
cfg.CenterX = cfg.MapSize / 2
}
if cfg.CenterY <= 0 {
cfg.CenterY = cfg.MapSize / 2
}
cfg.CenterX = int(float32(cfg.CenterX) * cfg.Scale)
cfg.CenterY = int(float32(cfg.CenterY) * cfg.Scale)
}
func Generate(cfg Config) error {
@ -53,6 +71,9 @@ func Generate(cfg Config) error {
upLeft := image.Point{0, 0}
lowRight := image.Point{cfg.MapSize, cfg.MapSize}
img := image.NewRGBA(image.Rectangle{upLeft, lowRight})
mapSizeDividedBy10 := cfg.MapSize / 10
imgHalfWidth := cfg.MapSize / 2
imgHalfHeight := imgHalfWidth
backgroundColor, err := parseHexColorFast(cfg.BackgroundColor)
if err != nil {
@ -83,12 +104,12 @@ func Generate(cfg Config) error {
if err != nil {
return errors.Wrap(err, "map-generator")
}
for y := cfg.MapSize / 10; y < cfg.MapSize; y += cfg.MapSize / 10 {
for y := mapSizeDividedBy10; y < cfg.MapSize; y += mapSizeDividedBy10 {
for x := 0; x < cfg.MapSize; x++ {
img.Set(x, y, gridLineColor)
}
}
for x := cfg.MapSize / 10; x < cfg.MapSize; x += cfg.MapSize / 10 {
for x := mapSizeDividedBy10; x < cfg.MapSize; x += mapSizeDividedBy10 {
for y := 0; y < cfg.MapSize; y++ {
img.Set(x, y, gridLineColor)
}
@ -101,8 +122,8 @@ func Generate(cfg Config) error {
if err != nil {
return errors.Wrap(err, "map-generator")
}
for y := cfg.MapSize / 10; y <= cfg.MapSize; y += cfg.MapSize / 10 {
for x := cfg.MapSize / 10; x <= cfg.MapSize; x += cfg.MapSize / 10 {
for y := mapSizeDividedBy10; y <= cfg.MapSize; y += mapSizeDividedBy10 {
for x := mapSizeDividedBy10; x <= cfg.MapSize; x += mapSizeDividedBy10 {
continentStr := fmt.Sprintf("%d", continent)
if continent < 10 {
continentStr = fmt.Sprintf("0%d", continent)
@ -113,7 +134,20 @@ func Generate(cfg Config) error {
}
}
if err := png.Encode(cfg.Destination, img); err != nil {
var resizedImg image.Image = img
if cfg.Scale != 1 {
width := uint(float32(cfg.MapSize) * cfg.Scale)
resizedImg = resize.Resize(width, width, img, resize.Lanczos3)
}
b := resizedImg.Bounds()
centered := image.NewRGBA(image.Rectangle{upLeft, lowRight})
draw.Draw(centered, b, resizedImg, image.Point{
X: cfg.CenterX - imgHalfWidth,
Y: cfg.CenterY - imgHalfHeight,
}, draw.Src)
if err := png.Encode(cfg.Destination, centered); err != nil {
return errors.Wrap(err, "map-generator")
}
return nil

1
go.mod
View File

@ -3,6 +3,7 @@ module github.com/tribalwarshelp/map-generator
go 1.14
require (
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
github.com/pkg/errors v0.9.1
github.com/tribalwarshelp/shared v0.0.0-20200622084436-3a768c8bf574
golang.org/x/image v0.0.0-20200618115811-c13761719519

2
go.sum
View File

@ -1,3 +1,5 @@
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/tribalwarshelp/shared v0.0.0-20200622084436-3a768c8bf574 h1:y2EoH6zRK9Uc0AeswnJRYUUIQYcSLZB5VDFuxPCKxNM=