1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-23 21:07:17 +00:00

euc:: moved Euclidean honeycomb shape definitions to euclid.cpp

This commit is contained in:
Zeno Rogue 2020-05-15 11:40:57 +02:00
parent 4cde3e0984
commit 711b9d37de
3 changed files with 77 additions and 57 deletions

View File

@ -1169,7 +1169,78 @@ EX int cyldist(gp::loc a, gp::loc b) {
return best; return best;
} }
EX bool in() { return euclid && standard_tiling(); } EX void generate() {
auto v = euc::get_shifttable();
auto& cs = cgi.cellshape;
if(S7 == 6) {
cgi.adjcheck = 1;
cgi.face = 4;
for(int w=0; w<6; w++) {
for(int a=0; a<4; a++) {
int t[3];
t[0] = (w>=3) ? -1 : 1;
t[1] = among(a, 0, 3) ? -1 : 1;
t[2] = among(a, 2, 3) ? -1 : 1;
int x = w%3;
int y = (x+2)%3;
int z = (y+2)%3;
cs.push_back(hpxy3(t[x]/2., t[y]/2., t[z]/2.));
}
}
}
if(S7 == 12) {
cgi.adjcheck = sqrt(2);
cgi.face = 4;
for(int w=0; w<12; w++) {
auto co = v[w];
vector<int> valid;
for(int c=0; c<3; c++) if(co[c]) valid.push_back(c);
int third = 3 - valid[1] - valid[0];
hyperpoint v0 = cpush0(valid[0], co[valid[0]] > 0 ? 1 : -1);
hyperpoint v1 = cpush0(valid[1], co[valid[1]] > 0 ? 1 : -1);
cs.push_back(v0);
cs.push_back(v0/2 + v1/2 + cpush0(third, .5) - C0);
cs.push_back(v1);
cs.push_back(v0/2 + v1/2 + cpush0(third, -.5) - C0);
}
}
if(S7 == 14) {
cgi.adjcheck = 2;
cgi.face = 4; /* the first face */
auto v = euc::get_shifttable();
for(int w=0; w<14; w++) {
if(w%7 < 3) {
int z = w>=7?-1:1;
cs.push_back(cpush0(w%7, z) + cpush0((w%7+1)%3, 1/2.) - C0);
cs.push_back(cpush0(w%7, z) + cpush0((w%7+2)%3, 1/2.) - C0);
cs.push_back(cpush0(w%7, z) + cpush0((w%7+1)%3,-1/2.) - C0);
cs.push_back(cpush0(w%7, z) + cpush0((w%7+2)%3,-1/2.) - C0);
}
else {
auto t = v[w];
ld x = t[0], y = t[1], z = t[2];
for(hyperpoint h: {
hpxy3(x, y/2, 0), hpxy3(x/2, y, 0), hpxy3(0, y, z/2),
hpxy3(0, y/2, z), hpxy3(x/2, 0, z), hpxy3(x, 0, z/2)
}) cs.push_back(h);
}
}
}
}
/** @brief returns true if the current geometry is based on this module
* (For example, Archimedean, kite, or fake with underlying non-Euclidean geometry returns false)
*/
EX bool in() {
return euclid && standard_tiling();
}
EX bool in(int dim) { return in() && WDIM == dim; } EX bool in(int dim) { return in() && WDIM == dim; }
EX bool in(int dim, int s7) { return in(dim) && S7 == s7; } EX bool in(int dim, int s7) { return in(dim) && S7 == s7; }

View File

@ -573,6 +573,7 @@ void geometry_information::prepare_basics() {
#endif #endif
#if MAXMDIM >= 4 #if MAXMDIM >= 4
if(reg3::in()) reg3::generate(); if(reg3::in()) reg3::generate();
if(euc::in(3)) euc::generate();
#endif #endif
hybrid_finish: hybrid_finish:

View File

@ -972,66 +972,14 @@ void geometry_information::create_wall3d() {
walloffsets.clear(); walloffsets.clear();
} }
if(GDIM == 3 && euclid && S7 == 6) { if(euc::in() || reg3::in()) {
for(int w=0; w<6; w++) {
vector<hyperpoint> vertices;
for(int a=0; a<4; a++) {
int t[3];
t[0] = (w>=3) ? -1 : 1;
t[1] = among(a, 0, 3) ? -1 : 1;
t[2] = among(a, 2, 3) ? -1 : 1;
int x = w%3;
int y = (x+2)%3;
int z = (y+2)%3;
vertices.push_back(hpxy3(t[x]/2., t[y]/2., t[z]/2.));
}
make_wall(w, vertices);
}
}
if(GDIM == 3 && euclid && S7 == 12) {
auto v = euc::get_shifttable();
for(int w=0; w<12; w++) {
auto co = v[w];
vector<int> valid;
for(int c=0; c<3; c++) if(co[c]) valid.push_back(c);
int third = 3 - valid[1] - valid[0];
hyperpoint v0 = cpush0(valid[0], co[valid[0]] > 0 ? 1 : -1);
hyperpoint v1 = cpush0(valid[1], co[valid[1]] > 0 ? 1 : -1);
make_wall(w, {v0, v0/2 + v1/2 + cpush0(third, .5) - C0, v1, v0/2 + v1/2 + cpush0(third, -.5) - C0});
}
}
if(GDIM == 3 && euclid && S7 == 14) {
auto v = euc::get_shifttable();
for(int w=0; w<14; w++) {
bshape(shWall3D[w], PPR::WALL);
if(w%7 < 3) {
int z = w>=7?-1:1;
make_wall(w, {
cpush0(w%7, z) + cpush0((w%7+1)%3, 1/2.) - C0,
cpush0(w%7, z) + cpush0((w%7+2)%3, 1/2.) - C0,
cpush0(w%7, z) + cpush0((w%7+1)%3,-1/2.) - C0,
cpush0(w%7, z) + cpush0((w%7+2)%3,-1/2.) - C0
});
}
else {
auto t = v[w];
ld x = t[0], y = t[1], z = t[2];
make_wall(w, {
hpxy3(x, y/2, 0), hpxy3(x/2, y, 0), hpxy3(0, y, z/2),
hpxy3(0, y/2, z), hpxy3(x/2, 0, z), hpxy3(x, 0, z/2)
});
}
}
}
if(reg3::in()) {
int facesize = isize(cgi.cellshape) / S7; int facesize = isize(cgi.cellshape) / S7;
int next = 0;
for(int w=0; w<S7; w++) { for(int w=0; w<S7; w++) {
vector<hyperpoint> vertices; vector<hyperpoint> vertices;
if(S7 == 14) facesize = (w%7 < 3 ? 4 : 6);
for(int a=0; a<facesize; a++) for(int a=0; a<facesize; a++)
vertices.push_back(cgi.cellshape[w*facesize+a]); vertices.push_back(cgi.cellshape[next++]);
make_wall(w, vertices); make_wall(w, vertices);
} }
} }