Newer
Older
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
/*
* Object for keeping track of the layout of our triangular grid.
* The triangle is made of cells, which have information about their
* connectedness to nearby cells.
*/
public class TriangleGrid
{
PVector center;
Cell[] cells;
PVector[] points;
class Cell
{
PVector center;
int[] neighbors;
Cell(float cx, float cy, int n1, int n2, int n3)
{
this.center = new PVector(cx, cy);
this.neighbors = new int[3];
this.neighbors[0] = n1;
this.neighbors[1] = n2;
this.neighbors[2] = n3;
}
};
void grid16()
{
// Layout for a 16-cell triangular grid.
// Each triangle side is 1 unit. "h" is the triangle height, "y" is the centroid height.
float h = sin(radians(60));
float y = tan(radians(30)) * 0.5;
cells = new Cell[16];
// Bottom row, left to right
cells[ 0] = new Cell( 0.0, h*0 + h*1/3, -1, 1, -1 );
cells[ 1] = new Cell( 0.5, h*0 + h*2/3, 11, 2, 0 );
cells[ 2] = new Cell( 1.0, h*0 + h*1/3, -1, 3, 1 );
cells[ 3] = new Cell( 1.5, h*0 + h*2/3, 9, 4, 2 );
cells[ 4] = new Cell( 2.0, h*0 + h*1/3, -1, 5, 3 );
cells[ 5] = new Cell( 2.5, h*0 + h*2/3, 7, 6, 4 );
cells[ 6] = new Cell( 3.0, h*0 + h*1/3, -1, -1, 5 );
// Second row, right to left
cells[ 7] = new Cell( 2.5, h*1 + h*1/3, 5, 8, -1 );
cells[ 8] = new Cell( 2.0, h*1 + h*2/3, 12, 9, 7 );
cells[ 9] = new Cell( 1.5, h*1 + h*1/3, 3, 10, 8 );
cells[10] = new Cell( 1.0, h*1 + h*2/3, 14, 11, 9 );
cells[11] = new Cell( 0.5, h*1 + h*1/3, 1, -1, 10 );
// Third row, left to right
cells[12] = new Cell( 1.0, h*2 + h*1/3, 8, 13, -1 );
cells[13] = new Cell( 1.5, h*2 + h*2/3, 15, 14, 13 );
cells[14] = new Cell( 2.0, h*2 + h*1/3, 10, -1, 14 );
// Top
cells[15] = new Cell( 1.5, h*3 + h*1/3, 13, -1, -1 );
// Move the centroid to the origin
translate(-1.5, -h*4/3);
}
void leds(OPC opc, int index)
{
// Create LED mappings, using the current grid coordinates
for (int i = 0; i < cells.length; i++) {
opc.led(index + i, int(cells[i].center.x + 0.5), int(cells[i].center.y + 0.5));
}
}
void translate(float x, float y)
{
// Translate all points by this amount
PVector t = new PVector(x, y);
for (int i = 0; i < cells.length; i++) {
cells[i].center.add(t);
}
}
void mirror()
{
// Mirror all points left-to-right
for (int i = 0; i < cells.length; i++) {
cells[i].center.x = -cells[i].center.x;
}
}
void scale(float s)
{
// Scale all points by this amount
for (int i = 0; i < cells.length; i++) {
cells[i].center.mult(s);
}
}
void rotate(float angle)
{
// Rotate all points around the origin by this angle, in radians
for (int i = 0; i < cells.length; i++) {
cells[i].center.rotate(angle);
}
}
};