1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-12-18 15:00:26 +00:00

transmatrix now implemented as an array of hyperpoints

This commit is contained in:
Zeno Rogue 2019-08-06 11:56:01 +02:00
parent c1b1e61069
commit ad5ec24e7b
4 changed files with 29 additions and 23 deletions

View File

@ -349,8 +349,8 @@ void filledPolygonColorI(SDL_Surface *s, int* px, int *py, int polyi, color_t co
#if CAP_TEXTURE #if CAP_TEXTURE
void drawTexturedTriangle(SDL_Surface *s, int *px, int *py, glvertex *tv, color_t col) { void drawTexturedTriangle(SDL_Surface *s, int *px, int *py, glvertex *tv, color_t col) {
transmatrix source = {{{ld(px[0]),ld(px[1]),ld(px[2])}, {ld(py[0]),ld(py[1]),ld(py[2])}, {1,1,1}}}; transmatrix source( point3(px[0], px[1], px[2]), point3(py[0], py[1], py[2]), point3(1,1,1), point31(0,0,0) );
transmatrix target = {{{tv[0][0],tv[1][0],tv[2][0]}, {tv[0][1],tv[1][1],tv[2][1]}, {1,1,1}}}; transmatrix target( point3(tv[0][0], tv[1][0], tv[2][0]), point3(tv[0][1],tv[1][1],tv[2][1]), point3(1,1,1), point31(0,0,0) );
transmatrix isource = inverse(source); transmatrix isource = inverse(source);
int minx = px[0], maxx = px[0]; int minx = px[0], maxx = px[0];
int miny = py[0], maxy = py[0]; int miny = py[0], maxy = py[0];

27
hyper.h
View File

@ -346,10 +346,14 @@ struct hyperpoint : array<ld, MAXMDIM> {
} }
}; };
struct transmatrix { struct transmatrix : array<hyperpoint, MAXMDIM> {
ld tab[MAXMDIM][MAXMDIM]; transmatrix() {}
ld * operator [] (int i) { return tab[i]; } transmatrix(hyperpoint a, hyperpoint b, hyperpoint c, hyperpoint d) {
const ld * operator [] (int i) const { return tab[i]; } (*this)[0] = a;
(*this)[1] = b;
(*this)[2] = c;
(*this)[3] = d;
}
}; };
inline hyperpoint operator * (const transmatrix& T, const hyperpoint& H) { inline hyperpoint operator * (const transmatrix& T, const hyperpoint& H) {
@ -371,12 +375,16 @@ inline transmatrix operator * (const transmatrix& T, const transmatrix& U) {
return R; return R;
} }
constexpr transmatrix diag(ld a, ld b, ld c, ld d) { inline transmatrix diag(ld a, ld b, ld c, ld d) {
#if MAXMDIM==3 transmatrix T;
return transmatrix{{{a,0,0}, {0,b,0}, {0,0,c}}}; for(int i=0; i<MAXMDIM; i++) for(int j=0; j<MAXMDIM; j++) T[i][j] = 0;
#else T[0][0] = a;
return transmatrix{{{a,0,0,0}, {0,b,0,0}, {0,0,c,0}, {0,0,0,d}}}; T[1][1] = b;
T[2][2] = c;
#if MAXMDIM==4
T[3][3] = d;
#endif #endif
return T;
} }
const static hyperpoint Hypc = hyperpoint(0, 0, 0, 0); const static hyperpoint Hypc = hyperpoint(0, 0, 0, 0);
@ -406,6 +414,7 @@ const static transmatrix centralsym = diag(-1,-1,-1,-1);
inline hyperpoint hpxyz(ld x, ld y, ld z) { return DIM == 2 ? hyperpoint(x,y,z,0) : hyperpoint(x,y,0,z); } inline hyperpoint hpxyz(ld x, ld y, ld z) { return DIM == 2 ? hyperpoint(x,y,z,0) : hyperpoint(x,y,0,z); }
inline hyperpoint hpxyz3(ld x, ld y, ld z, ld w) { return DIM == 2 ? hyperpoint(x,y,w,0) : hyperpoint(x,y,z,w); } inline hyperpoint hpxyz3(ld x, ld y, ld z, ld w) { return DIM == 2 ? hyperpoint(x,y,w,0) : hyperpoint(x,y,z,w); }
inline hyperpoint point3(ld x, ld y, ld z) { return hyperpoint(x,y,z,0); } inline hyperpoint point3(ld x, ld y, ld z) { return hyperpoint(x,y,z,0); }
inline hyperpoint point31(ld x, ld y, ld z) { return hyperpoint(x,y,z,1); }
inline hyperpoint point2(ld x, ld y) { return hyperpoint(x,y,0,0); } inline hyperpoint point2(ld x, ld y) { return hyperpoint(x,y,0,0); }
namespace hyperpoint_vec { namespace hyperpoint_vec {

View File

@ -353,22 +353,14 @@ transmatrix ypush(ld alpha) { return cpush(1, alpha); }
transmatrix zpush(ld z) { return cpush(2, z); } transmatrix zpush(ld z) { return cpush(2, z); }
transmatrix matrix3(ld a, ld b, ld c, ld d, ld e, ld f, ld g, ld h, ld i) { transmatrix matrix3(ld a, ld b, ld c, ld d, ld e, ld f, ld g, ld h, ld i) {
#if MAXMDIM==3
return transmatrix {{{a,b,c},{d,e,f},{g,h,i}}};
#else
if(DIM == 2) if(DIM == 2)
return transmatrix {{{a,b,c,0},{d,e,f,0},{g,h,i,0},{0,0,0,1}}}; return transmatrix(hyperpoint(a,b,c,0), hyperpoint(d,e,f,0), hyperpoint(g,h,i,0), hyperpoint(0,0,0,1));
else else
return transmatrix {{{a,b,0,c},{d,e,0,f},{0,0,1,0},{g,h,0,i}}}; return transmatrix(hyperpoint(a,b,0,c), hyperpoint(d,e,0,f), hyperpoint(0,0,1,0), hyperpoint(g,h,0,i));
#endif
} }
transmatrix matrix4(ld a, ld b, ld c, ld d, ld e, ld f, ld g, ld h, ld i, ld j, ld k, ld l, ld m, ld n, ld o, ld p) { transmatrix matrix4(ld a, ld b, ld c, ld d, ld e, ld f, ld g, ld h, ld i, ld j, ld k, ld l, ld m, ld n, ld o, ld p) {
#if MAXMDIM==3 return transmatrix(hyperpoint(a,b,c,d), hyperpoint(e,f,g,h), hyperpoint(i,j,k,l), hyperpoint(m,n,o,p));
return transmatrix {{{a,b,d},{e,f,h},{m,n,p}}};
#else
return transmatrix {{{a,b,c,d},{e,f,g,h},{i,j,k,l},{m,n,o,p}}};
#endif
} }
#if MAXMDIM >= 4 #if MAXMDIM >= 4

View File

@ -455,7 +455,12 @@ void buildTorusRug() {
// 7,-17 // 7,-17
// transmatrix z1 = {{{22,7,0}, {1,-17,0}, {0,0,1}}}; // transmatrix z1 = {{{22,7,0}, {1,-17,0}, {0,0,1}}};
transmatrix z1 = {{{(ld)solution.first.x,(ld)solution.second.x,0}, {(ld)solution.first.y,(ld)solution.second.y,0}, {0,0,1}}}; transmatrix z1(
point3(solution.first.x, solution.second.x, 0),
point3(solution.first.y, solution.second.y, 0),
point3(0, 0, 1),
point31(0, 0, 0)
);
transmatrix z2 = inverse(z1); transmatrix z2 = inverse(z1);
if(gwhere == gSphere) { if(gwhere == gSphere) {