mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	octagon geometry
This commit is contained in:
		
							
								
								
									
										31
									
								
								cell.cpp
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								cell.cpp
									
									
									
									
									
								
							| @@ -84,6 +84,7 @@ hrmap_hyperbolic::hrmap_hyperbolic() { | ||||
| int spherecells() { | ||||
|   if(S7 == 5) return (elliptic?6:12); | ||||
|   if(S7 == 4) return (elliptic?3:6); | ||||
|   if(S7 == 3 && S3 == 4) return (elliptic?4:8); | ||||
|   if(S7 == 3) return 4; | ||||
|   if(S7 == 2) return (elliptic?1:2); | ||||
|   if(S7 == 1) return 1; | ||||
| @@ -116,7 +117,34 @@ struct hrmap_spherical : hrmap { | ||||
|     else | ||||
|       siblings = {1, 0, 3, 2, 5, 4}; | ||||
|      | ||||
|     if(S7 == 4 && elliptic) { | ||||
|     if(S7 == 3 && S3 == 4) { | ||||
|       for(int i=0; i<8; i++) { | ||||
|         dodecahedron[i]->move(0) = dodecahedron[i^1]; | ||||
|         dodecahedron[i]->c.setspin(0, 0, false); | ||||
|         dodecahedron[i]->move(1) = dodecahedron[i^2]; | ||||
|         dodecahedron[i]->c.setspin(1, 1, false); | ||||
|         dodecahedron[i]->move(2) = dodecahedron[i^4]; | ||||
|         dodecahedron[i]->c.setspin(2, 2, false); | ||||
|         } | ||||
|       for(int i=0; i<8; i++) { | ||||
|         int s = (i&1)+((i&2)>>1)+((i&4)>>2); | ||||
|         if((s&1) == 1) { | ||||
|           swap(dodecahedron[i]->move(1), dodecahedron[i]->move(2)); | ||||
|           int a = dodecahedron[i]->c.spin(1); | ||||
|           int b = dodecahedron[i]->c.spin(2); | ||||
|           dodecahedron[i]->c.setspin(1, b, false); | ||||
|           dodecahedron[i]->c.setspin(2, a, false); | ||||
|           dodecahedron[i]->move(1)->c.setspin(b, 1, false); | ||||
|           dodecahedron[i]->move(2)->c.setspin(a, 2, false); | ||||
|           } | ||||
|         } | ||||
|       for(int i=0; i<8; i++) | ||||
|       for(int j=0; j<3; j++) | ||||
|         if(dodecahedron[i]->move(j)->move(dodecahedron[i]->c.spin(j)) != dodecahedron[i]) | ||||
|           println(hlog, "8"); | ||||
|       } | ||||
|        | ||||
|     else if(S7 == 4 && elliptic) { | ||||
|       for(int i=0; i<3; i++) { | ||||
|         int i1 = (i+1)%3; | ||||
|         int i2 = (i+2)%3; | ||||
| @@ -197,6 +225,7 @@ struct hrmap_spherical : hrmap { | ||||
|     for(int i=0; i<spherecells(); i++) for(int k=0; k<S7; k++) { | ||||
|       heptspin hs(dodecahedron[i], k, false); | ||||
|       heptspin hs2 = hs + wstep + (S7-1) + wstep + (S7-1) + wstep + (S7-1); | ||||
|       if(S3 == 4) hs2 = hs2 + wstep + (S7-1); | ||||
|       if(hs2.at != hs.at) printf("error %d,%d\n", i, k); | ||||
|       } | ||||
|     for(int i=0; i<spherecells(); i++) verifycells(dodecahedron[i]); | ||||
|   | ||||
| @@ -1694,6 +1694,7 @@ vector<geometryinfo> ginf = { | ||||
|   {"Schmutz's M(3)",      "M3",      12, 3, qsSMALL,   gcHyperbolic, 0x20400, {{4, 2}}, eVariation::bitruncated}, | ||||
|   {"Schmutz's M(4)",      "M4",      12, 3, qsSMALL,   gcHyperbolic, 0x20600, {{4, 2}}, eVariation::bitruncated}, | ||||
|   {"dimensional crystal", "Crystal",  6, 4, qANYQ,     gcHyperbolic, 0x28000, {{5, 3}}, eVariation::pure}, | ||||
|   {"octahedron",          "4x3",      3, 4, qsSMALLB,  gcSphere,     0x28200, {{SEE_ALL, SEE_ALL}}, eVariation::bitruncated}, | ||||
|   }; | ||||
|  | ||||
| // remember to match the following mask when specifying codes for extra geometries: 0x78600 | ||||
|   | ||||
| @@ -209,7 +209,7 @@ enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle | ||||
| enum eGeometry { | ||||
|   gNormal, gEuclid, gSphere, gElliptic, gZebraQuotient, gFieldQuotient, gTorus, gOctagon, g45, g46, g47, gSmallSphere, gTinySphere, gEuclidSquare, gSmallElliptic,  | ||||
|   gKleinQuartic, gBolza, gBolza2, gMinimal, gBinaryTiling, gArchimedean,  | ||||
|   gMacbeath, gBring, gSchmutzM2, gSchmutzM3, gCrystal, | ||||
|   gMacbeath, gBring, gSchmutzM2, gSchmutzM3, gCrystal, gOctahedron, | ||||
|   gGUARD}; | ||||
|  | ||||
| enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere }; | ||||
|   | ||||
| @@ -483,7 +483,7 @@ namespace hr { namespace gp { | ||||
|   #define corner_coords (S3==3 ? corner_coords6 : corner_coords4) | ||||
|    | ||||
|   hyperpoint cornmul(const transmatrix& corners, const hyperpoint& c) { | ||||
|     if(sphere) { | ||||
|     if(sphere && S3 == 3) { | ||||
|       ld cmin = c[0] * c[1] * c[2] * (6 - S7); | ||||
|       return corners * hpxyz(c[0] + cmin, c[1] + cmin, c[2] + cmin); | ||||
|       } | ||||
|   | ||||
| @@ -26,9 +26,16 @@ hstate transition(hstate s, int dir) { | ||||
|     if(S7 == 4) { | ||||
|       if(s == hsOrigin) return dir == 0 ? hsB0 : hsB1; | ||||
|       } | ||||
|     if(S7 == 3) { | ||||
|     if(S7 == 3 && S3 == 3) { | ||||
|       if(s == hsOrigin) return hsB1; | ||||
|       } | ||||
|     if(S7 == 3 && S3 == 4) { | ||||
|       if(s == hsOrigin) return dir == 0 ? hsA0 : hsA1; | ||||
|       if(s == hsA0 && dir == 1) return hsB0; | ||||
|       if(s == hsA1 && dir == 1) return hsB1; | ||||
|       if(s == hsB0 && dir == 2) return hsC; | ||||
|       return hsError; | ||||
|       } | ||||
|     if(s == hsOrigin) return dir == 0 ? hsA0 : hsA1; | ||||
|     if(s == hsA0 && dir == 2) return hsB0; | ||||
|     if(s == hsA1 && dir == 2) return hsB1; | ||||
|   | ||||
| @@ -736,7 +736,7 @@ namespace patterns { | ||||
|     if(IRREGULAR || archimedean || binarytiling) si.symmetries = 1; | ||||
|     else if(a46) val46(c, si, sub, pat); | ||||
|     else if(a38) val38(c, si, sub, pat); | ||||
|     else if(sphere) valSibling(c, si, sub, pat); | ||||
|     else if(sphere && S3 == 3) valSibling(c, si, sub, pat); | ||||
|     else if(euclid4) valEuclid4(c, si, sub); | ||||
|     else if(euclid) valEuclid6(c, si, sub); | ||||
|     else if(a4) val457(c, si, sub); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue