remove demo game

This commit is contained in:
2026-05-25 21:28:17 +02:00
parent b1ea3447a8
commit 76f910ab36
75 changed files with 115 additions and 815 deletions

79
util.geometry.go Normal file
View File

@@ -0,0 +1,79 @@
package pncdsl
import "math"
type Point struct {
X, Y float64
}
func (p Point) Add(q Point) Point { return Point{p.X + q.X, p.Y + q.Y} }
func (p Point) Sub(q Point) Point { return Point{p.X - q.X, p.Y - q.Y} }
func (p Point) Dist(q Point) float64 {
dx, dy := p.X-q.X, p.Y-q.Y
return math.Sqrt(dx*dx + dy*dy)
}
// Shape is a hotspot area. Rectangle and Polygon both satisfy it.
type Shape interface {
Contains(p Point) bool
Bounds() Rectangle
}
type Rectangle struct {
X, Y, W, H float64
}
func Rect(x, y, w, h float64) Rectangle { return Rectangle{X: x, Y: y, W: w, H: h} }
func (r Rectangle) Contains(p Point) bool {
return p.X >= r.X && p.X < r.X+r.W && p.Y >= r.Y && p.Y < r.Y+r.H
}
func (r Rectangle) Bounds() Rectangle { return r }
func (r Rectangle) Center() Point { return Point{X: r.X + r.W/2, Y: r.Y + r.H/2} }
type Polygon struct {
Points []Point
}
func Poly(pts ...Point) Polygon { return Polygon{Points: pts} }
func (g Polygon) Contains(pt Point) bool {
n := len(g.Points)
if n < 3 {
return false
}
inside := false
for i, j := 0, n-1; i < n; j, i = i, i+1 {
pi, pj := g.Points[i], g.Points[j]
if (pi.Y > pt.Y) != (pj.Y > pt.Y) &&
pt.X < (pj.X-pi.X)*(pt.Y-pi.Y)/(pj.Y-pi.Y)+pi.X {
inside = !inside
}
}
return inside
}
func (g Polygon) Bounds() Rectangle {
if len(g.Points) == 0 {
return Rectangle{}
}
minX, maxX := g.Points[0].X, g.Points[0].X
minY, maxY := g.Points[0].Y, g.Points[0].Y
for _, p := range g.Points[1:] {
if p.X < minX {
minX = p.X
}
if p.X > maxX {
maxX = p.X
}
if p.Y < minY {
minY = p.Y
}
if p.Y > maxY {
maxY = p.Y
}
}
return Rectangle{X: minX, Y: minY, W: maxX - minX, H: maxY - minY}
}