Newer
Older
/*
* 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
{
Cell[] cells;
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
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
float h = sin(radians(60));
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);
}
}
};