1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-12-30 03:50:34 +00:00

intra:: better H3/Solv portals

This commit is contained in:
Zeno Rogue 2021-10-07 12:52:47 +02:00
parent e4ea3b9de2
commit cb6226b5ab

View File

@ -67,12 +67,18 @@ hyperpoint portal_data::to_poco(hyperpoint h) const {
return h; return h;
} }
else if(hyperbolic && bt::in()) { else if(hyperbolic && bt::in()) {
h = T * bt::minkowski_to_bt(h); h = deparabolic13(h);
for(int i: {0,1,2}) h[i] *= (log(2)/2); h[3] = 1;
tie(h[0], h[1], h[2]) = make_tuple(h[1], h[2], h[0]);
h = T * h;
h[2] *= exp(h[1]);
return h;
}
else if(sol) {
h = T * h;
h[2] *= exp(-h[1]);
return h; return h;
} }
else if(sol)
return T * h;
else { else {
h = T * h; h = T * h;
h /= h[3]; h /= h[3];
@ -94,14 +100,17 @@ hyperpoint portal_data::from_poco(hyperpoint h) const {
h[1] = sin_auto(h0[0]); h[1] = sin_auto(h0[0]);
h[2] = cos_auto(h0[0]) * cos_auto(h0[2]); h[2] = cos_auto(h0[0]) * cos_auto(h0[2]);
h[3] = 1; h[3] = 1;
return iT * h * exp(h0[1]); return iT * h * exp(-h0[1]);
} }
else if(hyperbolic && bt::in()) { else if(hyperbolic && bt::in()) {
for(int i: {0,1,2}) h[i] *= (2/log(2)); h[2] *= exp(-h[1]);
return bt::bt_to_minkowski(iT * h); h = iT * h;
return hr::parabolic13(h[0], h[1]) * xpush0(h[2]);
} }
else if(sol) else if(sol) {
h[2] *= exp(h[1]);
return iT * h; return iT * h;
}
else { else {
h[3] = 1; h[3] = 1;
return normalize(iT * h); return normalize(iT * h);
@ -139,27 +148,46 @@ EX portal_data make_portal(cellwalker cw, int spin) {
} }
} }
else if(bt::in()) { else if(bt::in()) {
hyperpoint removed = Hypc;
for(int i=0; i<isize(fac); i++) { for(int i=0; i<isize(fac); i++) {
int i1 = i+1; if(i1 >= isize(fac)) i1 = 0; int i1 = i+1; if(i1 >= isize(fac)) i1 = 0;
int i2 = i1+1; if(i2 >= isize(fac)) i2 = 0; int i2 = i1+1; if(i2 >= isize(fac)) i2 = 0;
if(hypot_d(3, 2*fac[i1] - fac[i] - fac[i2]) < 1e-3) if(hypot_d(3, 2*fac[i1] - fac[i] - fac[i2]) < 1e-3) {
removed = fac[i1];
fac.erase(fac.begin()+i1); fac.erase(fac.begin()+i1);
}
} }
id.kind = 0; id.kind = 0;
id.v0 = Hypc; id.v0 = Hypc;
id.T = Id; id.T = Id;
for(auto& h: fac) h[3] = 1; for(auto& h: fac) h[3] = 1;
for(auto p: fac) id.v0 += p; auto fac1 = fac;
auto to_coords = [] (hyperpoint& p) {
if(hyperbolic) {
p[0] *= bt::xy_mul();
p[1] *= bt::xy_mul();
p[2] *= log(2) / 2;
}
};
for(auto& p: fac1)
to_coords(p);
to_coords(removed);
for(auto p: fac1) id.v0 += p;
id.v0 /= isize(fac); id.v0 /= isize(fac);
dynamicval<eGeometry> g(geometry, gCubeTiling); dynamicval<eGeometry> g(geometry, gCubeTiling);
id.T = gpushxto0(id.v0); id.T = gpushxto0(id.v0);
for(auto p: fac) { for(auto p: fac1) {
if(abs((id.T * p)[2]) > 1e-3 && abs((id.T * p)[0]) < 1e-3) if(abs((id.T * p)[2]) > 1e-3 && abs((id.T * p)[0]) < 1e-3)
id.T = cspin(2, 0, 90*degree) * id.T; id.T = cspin(2, 0, 90*degree) * id.T;
if(abs((id.T * p)[2]) > 1e-3 && abs((id.T * p)[1]) < 1e-3) if(abs((id.T * p)[2]) > 1e-3 && abs((id.T * p)[1]) < 1e-3)
id.T = cspin(2, 1, 90*degree) * id.T; id.T = cspin(2, 1, 90*degree) * id.T;
} }
if((id.T * C03)[2] > 0) id.T = cspin(2, 0, 180*degree) * id.T; if((id.T * C03)[2] > 0) id.T = cspin(2, 0, 180*degree) * id.T;
if(abs((id.T * removed)[0]) > 1e-2) id.T = cspin(0, 1, 90*degree) * id.T;
if((id.T * removed)[1] < -1e-2) id.T = cspin(0, 1, 180*degree) * id.T;
vector<hyperpoint> v; vector<hyperpoint> v;
geometry = gg; geometry = gg;
for(auto f: fac) v.push_back(id.to_poco(final_coords(f))); for(auto f: fac) v.push_back(id.to_poco(final_coords(f)));