/
regions.go
129 lines (105 loc) · 2 KB
/
regions.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package windigo
type Point struct {
X, Y int
}
type TopLeft Point
type NexusType Point
type nexusType int
const (
nexusTopLeft nexusType = iota
nexusTopRight
nexusBottomLeft
nexusBottomRight
_
_
nexusLeftT
nexusRightT
nexusTopT
nexusBottomT
nexusCross
nexusNone
)
type WidthHeight struct {
W, H int
}
type Region struct {
TopLeft
WidthHeight
RightMost, BottomMost bool
Valid bool
}
func NewRegion(x, y, width, height int) *Region {
r := new(Region)
r.X = x
r.Y = y
r.W = width
r.H = height
r.Valid = true
return r
}
func (r *Region) Loc() (x, y int) {
return r.X, r.Y
}
func (r *Region) Size() (w, h int) {
return r.W, r.H
}
type RegionType []Region
func (r RegionType) Len() int {
return len(r)
}
func (r RegionType) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}
func (r RegionType) Less(i, j int) bool {
x1 := r[i].X + 1
y1 := r[i].Y + 1
x2 := r[j].X + 1
y2 := r[j].Y + 1
if x1 < x2 && y1 < y2 {
return true
}
if x1 < x2 && y1 >= y2 {
if y1 == y2 {
return true
}
return false
}
if x1 >= x2 && y1 < y2 {
if x1 == x2 {
return true
}
return false
}
if x1 >= x2 && y1 >= y2 {
return false
}
return false
}
// Return the integer absolute value.
func abs(i int) int {
if i >= 0 {
return i
}
return -i
}
// This is the left edge of the region in it's window's coordinates.
func (r *Region) Left() *Line {
left := Line{P1: Point{X: r.X, Y: r.Y}, P2: Point{X: r.X, Y: r.Y + r.H - 1}}
left.Orientation = Vertical
return &left
}
func (r *Region) Right() *Line {
right := Line{P1: Point{X: r.X + r.W - 1, Y: r.Y}, P2: Point{X: r.X + r.W - 1, Y: r.Y + r.H - 1}}
right.Orientation = Vertical
return &right
}
func (r *Region) Top() *Line {
top := Line{P1: Point{X: r.X, Y: r.Y}, P2: Point{X: r.X + r.W - 1, Y: r.Y}}
top.Orientation = Horizontal
return &top
}
func (r *Region) Bottom() *Line {
bottom := Line{P1: Point{X: r.X, Y: r.Y + r.H - 1}, P2: Point{X: r.X + r.W - 1, Y: r.Y + r.H - 1}}
bottom.Orientation = Horizontal
return &bottom
}