-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgrid.go
More file actions
133 lines (114 loc) · 2.44 KB
/
Copy pathgrid.go
File metadata and controls
133 lines (114 loc) · 2.44 KB
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
130
131
132
133
package pixicons
type grid4x4 [4][4]bool
type grid8x8 [8][8]bool
type Grid struct {
G grid8x8
Fg string
Bg string
}
type TransformMode int
const (
ModeMirror TransformMode = iota // Q2=flipX, Q3=flipY, Q4=rot180
ModeRotateCycle // Q2=rot90, Q3=rot270, Q4=rot180
ModeTile // All quadrants = Q1
ModeAntiSymmetry // Q2=~Q1, Q3=~Q1, Q4=Q1
ModeHybrid // Q2=rot90, Q3=flipY, Q4=flipX(rot180)
)
// fromHash converts a hash string to a 4x4 grid.
func fromHash(hash string) grid4x4 {
var grid grid4x4
hash = hash[:16]
for i, char := range hash {
row := i / 4
col := i % 4
switch {
case char >= '0' && char <= '9':
grid[row][col] = int(char-'0') >= 8
case char >= 'a' && char <= 'f':
grid[row][col] = int(char-'a'+10) >= 8
case char >= 'A' && char <= 'F':
grid[row][col] = int(char-'A'+10) >= 8
default:
grid[row][col] = false
}
}
return grid
}
// expandTo8x8 expands a 4x4 grid to an 8x8 grid using the specified transform mode.
func (g grid4x4) expandTo8x8(mode TransformMode) grid8x8 {
var q1 = g
var q2, q3, q4 grid4x4
switch mode {
case ModeMirror:
q2 = flipX(q1)
q3 = flipY(q1)
q4 = rot180(q1)
case ModeRotateCycle:
q2 = rotate90(q1)
q3 = rotate270(q1)
q4 = rot180(q1)
case ModeTile:
q2, q3, q4 = q1, q1, q1
case ModeAntiSymmetry:
q2 = invert(q1)
q3 = invert(q1)
q4 = q1
case ModeHybrid:
q2 = rotate90(q1)
q3 = flipY(q1)
q4 = flipX(rot180(q1))
}
var out grid8x8
for i := 0; i < 4; i++ {
copy(out[i][:4], q1[i][:])
copy(out[i][4:], q2[i][:])
copy(out[i+4][:4], q3[i][:])
copy(out[i+4][4:], q4[i][:])
}
return out
}
// ---- Helper transforms (4x4 only) ----
func flipX(g grid4x4) grid4x4 {
var r grid4x4
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
r[i][j] = g[i][3-j]
}
}
return r
}
func flipY(g grid4x4) grid4x4 {
var r grid4x4
for i := 0; i < 4; i++ {
r[i] = g[3-i]
}
return r
}
func rot180(g grid4x4) grid4x4 { return flipX(flipY(g)) }
func rotate90(g grid4x4) grid4x4 {
var r grid4x4
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
r[j][3-i] = g[i][j]
}
}
return r
}
func rotate270(g grid4x4) grid4x4 {
var r grid4x4
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
r[3-j][i] = g[i][j]
}
}
return r
}
func invert(g grid4x4) grid4x4 {
var r grid4x4
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
r[i][j] = !g[i][j]
}
}
return r
}