package generator import ( "errors" "fmt" "math/rand" "github.com/iliadenisov/galaxy/pkg/bitmap" ) type Plotter struct { factor float32 clearFn func() circleFn func(x, y int, r float32) freeCountFn func() int freeNumberToCoordFn func(int) (int, int) } func NewPlotter(width, height uint, factor float32) (Plotter, error) { if factor > 1 || factor <= 0 { return Plotter{}, fmt.Errorf("factor should be: 0 > F <= 1") } sectorsX := uint32(float32(width) / factor) sectorsY := uint32(float32(height) / factor) bm := bitmap.NewBitmap(sectorsX, sectorsY) return Plotter{ factor: factor, clearFn: bm.Clear, circleFn: func(x, y int, r float32) { bm.Circle(x, y, r, true) }, freeCountFn: bm.FreeCount, freeNumberToCoordFn: func(n int) (x int, y int) { x, y, err := bm.GetFreeN(n) if err != nil { panic(err) } return }, }, nil } func (p Plotter) RandomFreePoint(deadZoneRaduis float32) (float32, float32, error) { fsCount := p.freeCountFn() if fsCount == 0 { return 0, 0, errors.New("no more space for planets") } next := rand.Intn(fsCount) x, y := p.freeNumberToCoordFn(next) p.PlotDeadZone(x, y, deadZoneRaduis) planetX := float32(x)*p.factor + rand.Float32()*p.factor // TODO: correct shift? planetY := float32(y)*p.factor + rand.Float32()*p.factor return planetX, planetY, nil } func (p Plotter) MarkDeadZone(x, y float32, radius float32) { p.PlotDeadZone(int(x/p.factor), int(y/p.factor), radius) } func (p Plotter) PlotDeadZone(x, y int, radius float32) { p.circleFn(x, y, radius/p.factor) }