embedding:: a simple general implementation of radar

This commit is contained in:
Zeno Rogue 2023-01-29 16:09:00 +01:00
parent 5c2b206433
commit ba03d33959
5 changed files with 24 additions and 118 deletions

View File

@ -51,6 +51,7 @@ struct display_data {
vector<radarpoint> radarpoints; vector<radarpoint> radarpoints;
vector<radarline> radarlines; vector<radarline> radarlines;
transmatrix radar_transform; transmatrix radar_transform;
transmatrix radar_transform_post;
ld eyewidth(); ld eyewidth();
bool stereo_active(); bool stereo_active();

View File

@ -83,7 +83,7 @@ EX bool mouseout2() {
EX movedir vectodir(hyperpoint P) { EX movedir vectodir(hyperpoint P) {
transmatrix U = unshift(ggmatrix(cwt.at)); transmatrix U = unshift(ggmatrix(cwt.at));
if(embedded_plane && cgi.emb->is_same_in_same()) U = current_display->radar_transform * U; if(embedded_plane && cgi.emb->is_same_in_same()) U = current_display->radar_transform_post * current_display->radar_transform * U;
P = direct_exp(lp_iapply(P)); P = direct_exp(lp_iapply(P));

View File

@ -229,7 +229,7 @@ EX }
virtual transmatrix actual_to_base(const transmatrix &T) = 0; virtual transmatrix actual_to_base(const transmatrix &T) = 0;
virtual hyperpoint normalize_flat(hyperpoint a) { return flatten(normalize(a)); } virtual hyperpoint normalize_flat(hyperpoint a) { return flatten(normalize(a)); }
virtual hyperpoint flatten(hyperpoint a); virtual hyperpoint flatten(hyperpoint a);
virtual transmatrix get_radar_transform(const transmatrix& V); virtual void set_radar_transform();
virtual transmatrix get_lsti() { return Id; } virtual transmatrix get_lsti() { return Id; }
virtual transmatrix get_lti() { return logical_scaled_to_intermediate; } virtual transmatrix get_lti() { return logical_scaled_to_intermediate; }
virtual hyperpoint base_to_logical(hyperpoint h) = 0; virtual hyperpoint base_to_logical(hyperpoint h) = 0;
@ -947,55 +947,17 @@ EX const transmatrix& lmirror() {
return Mirror; return Mirror;
} }
transmatrix embedding_method::get_radar_transform(const transmatrix& V) { void embedding_method::set_radar_transform() {
if(cgi.emb->is_euc_in_sl2()) { auto& rt = current_display->radar_transform;
return inverse(actual_view_transform * V); auto& rtp = current_display->radar_transform_post;
} if(!embedded_plane) { rt = rtp = Id; return; }
else if(nonisotropic) { transmatrix U = actual_view_transform * View;
transmatrix T = actual_view_transform * V; auto a = inverse(U) * C0;
ld z = -tC0(view_inverse(T)) [2]; auto l = actual_to_intermediate(a);
transmatrix R = actual_view_transform; l[2] = 0;
R = logical_scaled_to_intermediate * R; rt = inverse(intermediate_to_actual_translation(l)) * inverse(U);
if(R[1][2] || R[2][2]) transmatrix T = intermediate_to_logical * View * intermediate_to_actual_translation(l);
R = cspin(1, 2, -atan2(R[1][2], R[2][2])) * R; rtp = cspin(0, 1, atan2(T[0][1], T[0][0]));
if(R[0][2] || R[2][2])
R = cspin(0, 2, -atan2(R[0][2], R[2][2])) * R;
if(is_hyp_in_solnih()) R = Id;
R = intermediate_to_logical_scaled * R;
return inverse(R) * zpush(-z);
}
else if(gproduct) {
transmatrix T = V;
ld z = zlevel(tC0(inverse(T)));
transmatrix R = NLP;
if(R[1][2] || R[2][2])
R = cspin(1, 2, -atan2(R[1][2], R[2][2])) * R;
if(R[0][2] || R[2][2])
R = cspin(0, 2, -atan2(R[0][2], R[2][2])) * R;
return R * zpush(z);
}
else if(is_euc_in_sph()) {
return inverse(V);
}
else if(is_cylinder()) {
return inverse(V);
}
else {
transmatrix T = actual_view_transform * V;
transmatrix U = view_inverse(T);
if(T[0][2] || T[1][2])
T = spin(-atan2(T[0][2], T[1][2])) * T;
if(T[1][2] || T[2][2])
T = cspin(1, 2, -atan2(T[1][2], T[2][2])) * T;
ld z = -asin_auto(tC0(view_inverse(T)) [2]);
T = zpush(-z) * T;
return T * U;
}
} }
EX void swapmatrix(transmatrix& T) { EX void swapmatrix(transmatrix& T) {

View File

@ -5066,9 +5066,7 @@ EX void make_actual_view() {
nisot::local_perspective_used = true; nisot::local_perspective_used = true;
} }
#endif #endif
#if MAXMDIM >= 4 cgi.emb->set_radar_transform();
if(embedded_plane) current_display->radar_transform = cgi.emb->get_radar_transform(View);
#endif
Viewbase = View; Viewbase = View;
} }

View File

@ -27,75 +27,20 @@ pair<bool, hyperpoint> makeradar(shiftpoint h) {
if(d >= vid.radarrange) return {false, h1}; if(d >= vid.radarrange) return {false, h1};
if(d) h1 = h1 * (d / vid.radarrange / hypot_d(3, 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 { else {
if(cgi.emb->is_euc_in_hyp()) { h1 = cgi.emb->actual_to_base(h.h);
for(int a=0; a<3; a++) h1[a] = h1[a] / (1 + h1[3]); h1 = current_display->radar_transform_post * h1;
h1[2] -= 1; if(mhyperbolic) {
h1 *= 2 / sqhypot_d(3, h1); h1[LDIM] = h1[2]; h1[2] = 0;
d = hypot_d(2, h1); for(int a=0; a<LDIM; a++) h1[a] = h1[a] / (1 + h1[LDIM]);
if(d > vid.radarrange) return {false, h1}; h1[3] *= 2;
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4); }
} if(meuclid) {
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 {
d = hypot_d(2, h1); d = hypot_d(2, h1);
if(d > vid.radarrange) return {false, h1}; if(d > vid.radarrange) return {false, h1};
if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4); if(d) h1 = h1 / (vid.radarrange + cgi.scalefactor/4);
} }
/* no change for sphere! */
} }
if(invalid_point(h1)) return {false, h1}; if(invalid_point(h1)) return {false, h1};
return {true, h1}; return {true, h1};