1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-07-12 22:22:49 +00:00

made euc_in_hyp scalable

This commit is contained in:
Zeno Rogue 2023-05-01 15:49:25 +02:00
parent cad46dc16f
commit 043fc38dc6
2 changed files with 17 additions and 11 deletions

View File

@ -2526,7 +2526,7 @@ EX void show3D() {
} }
if(WDIM == 2) { if(WDIM == 2) {
if(cgi.emb->is_euc_in_noniso()) { if(cgi.emb->is_euc_scalable()) {
add_edit(geom3::euclid_embed_scale); add_edit(geom3::euclid_embed_scale);
add_edit(geom3::euclid_embed_scale_y); add_edit(geom3::euclid_embed_scale_y);
add_edit(geom3::euclid_embed_rotate); add_edit(geom3::euclid_embed_rotate);

View File

@ -280,6 +280,7 @@ EX }
virtual bool is_same_in_same() { return false; } virtual bool is_same_in_same() { return false; }
virtual bool is_sph_in_low() { return false; } virtual bool is_sph_in_low() { return false; }
virtual bool is_hyp_in_solnih() { return false; } virtual bool is_hyp_in_solnih() { return false; }
virtual bool is_euc_scalable() { return false; }
virtual bool is_euc_in_hyp() { return false; } virtual bool is_euc_in_hyp() { return false; }
virtual bool is_euc_in_sph() { return false; } virtual bool is_euc_in_sph() { return false; }
virtual bool is_euc_in_nil() { return false; } virtual bool is_euc_in_nil() { return false; }
@ -606,9 +607,19 @@ struct emb_product_embedding : emb_actual {
} }
}; };
struct emb_euc_scalable : emb_actual {
bool is_euc_scalable() override { return true; }
transmatrix get_lti() override {
transmatrix lti = Id;
lti[0][0] *= geom3::euclid_embed_scale;
lti[1][1] *= geom3::euclid_embed_scale * geom3::euclid_embed_scale_y;
return logical_scaled_to_intermediate * cspin(0, 1, geom3::euclid_embed_rotate * degree) * lti;
}
};
/** embed Euclidean plane as horosphere */ /** embed Euclidean plane as horosphere */
struct emb_euc_in_hyp : emb_actual { struct emb_euc_in_hyp : emb_euc_scalable {
bool is_euc_in_hyp() override { return true; } bool is_euc_in_hyp() override { return true; }
hyperpoint actual_to_intermediate(hyperpoint a) override { return deparabolic13(a); } hyperpoint actual_to_intermediate(hyperpoint a) override { return deparabolic13(a); }
transmatrix intermediate_to_actual_translation(hyperpoint i) override { return parabolic13_at(i); } transmatrix intermediate_to_actual_translation(hyperpoint i) override { return parabolic13_at(i); }
@ -616,16 +627,18 @@ struct emb_euc_in_hyp : emb_actual {
geom3::light_flip(true); geom3::light_flip(true);
hyperpoint mov = T * C02; hyperpoint mov = T * C02;
transmatrix U = gpushxto0(mov) * T; transmatrix U = gpushxto0(mov) * T;
mov = logical_to_intermediate * mov;
geom3::light_flip(false); geom3::light_flip(false);
for(int i=0; i<4; i++) U[i][3] = U[3][i] = i == 3; for(int i=0; i<4; i++) U[i][3] = U[3][i] = i == 3;
return parabolic13(mov[0], mov[1]) * U; return parabolic13(mov[0], mov[1]) * U;
} }
hyperpoint base_to_actual(hyperpoint h) override { hyperpoint base_to_actual(hyperpoint h) override {
h = logical_to_intermediate * h;
h[3] = h[2]; h[2] = 0; return parabolic13(h[0], h[1]) * C0; h[3] = h[2]; h[2] = 0; return parabolic13(h[0], h[1]) * C0;
} }
hyperpoint actual_to_base(hyperpoint h) override { hyperpoint actual_to_base(hyperpoint h) override {
hyperpoint h1 = deparabolic13(h); h1[2] = 1; hyperpoint h1 = deparabolic13(h); h1[2] = 1;
return h1; return intermediate_to_logical * h1;
} }
transmatrix actual_to_base(const transmatrix& T) override { hyperpoint h = deparabolic13(T * C0); return eupush(h[0], h[1]); } transmatrix actual_to_base(const transmatrix& T) override { hyperpoint h = deparabolic13(T * C0); return eupush(h[0], h[1]); }
ld anim_center_z() override { return vid.depth; } ld anim_center_z() override { return vid.depth; }
@ -703,7 +716,7 @@ struct emb_sphere_in_low : emb_actual {
/** abstract class for embeddings of Euclidean plane; these embeddings are not isotropic */ /** abstract class for embeddings of Euclidean plane; these embeddings are not isotropic */
struct emb_euclid_noniso : emb_actual { struct emb_euclid_noniso : emb_euc_scalable {
bool is_euc_in_noniso() override { return true; } bool is_euc_in_noniso() override { return true; }
bool is_in_noniso() override { return true; } bool is_in_noniso() override { return true; }
transmatrix base_to_actual(const transmatrix &T) override { transmatrix base_to_actual(const transmatrix &T) override {
@ -722,13 +735,6 @@ struct emb_euclid_noniso : emb_actual {
return h1; return h1;
} }
transmatrix actual_to_base(const transmatrix& T) override { hyperpoint h = actual_to_base(T * tile_center()); return eupush(h[0], h[1]); } transmatrix actual_to_base(const transmatrix& T) override { hyperpoint h = actual_to_base(T * tile_center()); return eupush(h[0], h[1]); }
transmatrix get_lti() override {
transmatrix lti = Id;
lti[0][0] *= geom3::euclid_embed_scale;
lti[1][1] *= geom3::euclid_embed_scale * geom3::euclid_embed_scale_y;
return logical_scaled_to_intermediate * cspin(0, 1, geom3::euclid_embed_rotate * degree) * lti;
}
}; };
struct emb_euc_in_product : emb_euclid_noniso { struct emb_euc_in_product : emb_euclid_noniso {