-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlayout.go
61 lines (48 loc) · 918 Bytes
/
layout.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package main
import "math"
type Point struct {
X float64
Y float64
}
type Poly []Point
type Layout interface {
Width() float64
Height() float64
NumCells() int
Cell(n int) Poly
}
func (points Poly) BoundingBox() (tl, br Point) {
if len(points) == 0 {
return
}
xmin := points[0].X
xmax := points[0].X
ymin := points[0].Y
ymax := points[0].Y
for _, p := range points {
xmin = math.Min(xmin, p.X)
xmax = math.Max(xmax, p.X)
ymin = math.Min(ymin, p.Y)
ymax = math.Max(ymax, p.Y)
}
return Point{xmin, ymin}, Point{xmax, ymax}
}
func (poly Poly) PointInside(point Point) bool {
if len(poly) < 2 {
return false
}
cnt := 0
for i := range poly {
begin := poly[i]
end := poly[(i+1)%len(poly)]
vx := end.X - begin.X
vy := end.Y - begin.Y
vpx := point.X - begin.X
vpy := point.Y - begin.Y
prod := vpx*vy - vpy*vx
if prod <= 0 {
cnt++
}
}
return cnt == len(poly)
}