mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-10-24 10:27:45 +00:00
embedding:: a simple general implementation of radar
This commit is contained in:
73
radar.cpp
73
radar.cpp
@@ -27,75 +27,20 @@ pair<bool, hyperpoint> makeradar(shiftpoint h) {
|
||||
if(d >= vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 * (d / vid.radarrange / hypot_d(3, h1));
|
||||
}
|
||||
else if(mhyperbolic) {
|
||||
if(cgi.emb->is_hyp_in_solnih()) {
|
||||
geom3::light_flip(true);
|
||||
h1 = parabolic1(h1[1]) * xpush0(h1[0]);
|
||||
geom3::light_flip(false);
|
||||
h1[3] = h1[2]; h1[2] = 0;
|
||||
// h1 = current_display->radar_transform * h1;
|
||||
}
|
||||
for(int a=0; a<LDIM; a++) h1[a] = h1[a] / (1 + h1[LDIM]);
|
||||
}
|
||||
else if(msphere) {
|
||||
if(cgi.emb->is_same_in_same()) h1[2] = h1[LDIM];
|
||||
if(hyperbolic) h1 /= sinh(1);
|
||||
}
|
||||
else {
|
||||
if(cgi.emb->is_euc_in_hyp()) {
|
||||
for(int a=0; a<3; a++) h1[a] = h1[a] / (1 + h1[3]);
|
||||
h1[2] -= 1;
|
||||
h1 *= 2 / sqhypot_d(3, h1);
|
||||
d = hypot_d(2, h1);
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
|
||||
}
|
||||
else if(cgi.emb->is_same_in_same()) {
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 * (d / (vid.radarrange + cgi.scalefactor/4) / hypot_d(3, h1));
|
||||
}
|
||||
else if(cgi.emb->is_euc_in_sph()) {
|
||||
h1[0] = atan2(h.h[0], h.h[2]);
|
||||
h1[1] = atan2(h.h[1], h.h[3]);
|
||||
h1[2] = 0;
|
||||
h1 = cgi.emb->intermediate_to_logical * h1;
|
||||
d = hypot_d(2, h1);
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
|
||||
}
|
||||
else if(cgi.emb->is_cylinder()) {
|
||||
h1[0] = h.h[0];
|
||||
h1[1] = atan2(h.h[1], h.h[2]);
|
||||
h1[2] = 0;
|
||||
h1 = cgi.emb->intermediate_to_logical * h1;
|
||||
d = hypot_d(2, h1);
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
|
||||
}
|
||||
else if(cgi.emb->is_euc_in_sl2()) {
|
||||
h1 = cgi.emb->intermediate_to_logical * cgi.emb->actual_to_intermediate(unshift(h)); h1[1] = -h1[1];
|
||||
d = hypot_d(2, h1);
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
|
||||
}
|
||||
else if(cgi.emb->is_euc_in_product()) {
|
||||
if(in_h2xe())
|
||||
h1[0] = atanh(h.h[0] / h.h[2]);
|
||||
else
|
||||
h1[0] = atan2(h.h[2], h.h[0]);
|
||||
h1[2] = - zlevel(h.h) - h.shift;
|
||||
h1[1] = 0;
|
||||
h1[3] = 0;
|
||||
h1 = cgi.emb->intermediate_to_logical * h1;
|
||||
d = hypot_d(2, h1);
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
|
||||
}
|
||||
else {
|
||||
h1 = cgi.emb->actual_to_base(h.h);
|
||||
h1 = current_display->radar_transform_post * h1;
|
||||
if(mhyperbolic) {
|
||||
h1[LDIM] = h1[2]; h1[2] = 0;
|
||||
for(int a=0; a<LDIM; a++) h1[a] = h1[a] / (1 + h1[LDIM]);
|
||||
h1[3] *= 2;
|
||||
}
|
||||
if(meuclid) {
|
||||
d = hypot_d(2, h1);
|
||||
if(d > vid.radarrange) return {false, h1};
|
||||
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
|
||||
}
|
||||
/* no change for sphere! */
|
||||
}
|
||||
if(invalid_point(h1)) return {false, h1};
|
||||
return {true, h1};
|
||||
|
||||
Reference in New Issue
Block a user