()
| 61 | } |
| 62 | |
| 63 | func (p *Polygon) Mutate() { |
| 64 | const m = 16 |
| 65 | w := p.Worker.W |
| 66 | h := p.Worker.H |
| 67 | rnd := p.Worker.Rnd |
| 68 | for { |
| 69 | if rnd.Float64() < 0.25 { |
| 70 | i := rnd.Intn(p.Order) |
| 71 | j := rnd.Intn(p.Order) |
| 72 | p.X[i], p.Y[i], p.X[j], p.Y[j] = p.X[j], p.Y[j], p.X[i], p.Y[i] |
| 73 | } else { |
| 74 | i := rnd.Intn(p.Order) |
| 75 | p.X[i] = clamp(p.X[i]+rnd.NormFloat64()*16, -m, float64(w-1+m)) |
| 76 | p.Y[i] = clamp(p.Y[i]+rnd.NormFloat64()*16, -m, float64(h-1+m)) |
| 77 | } |
| 78 | if p.Valid() { |
| 79 | break |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | func (p *Polygon) Valid() bool { |
| 85 | if !p.Convex { |
no test coverage detected