renamed apply_ori to more intuitive scr_to_ori, also invert the matrix

This commit is contained in:
Zeno Rogue 2023-08-14 11:08:37 +02:00
parent ea193d23b1
commit 6806a0e7e3
5 changed files with 60 additions and 58 deletions

View File

@ -1683,7 +1683,7 @@ bool broken_projection(dqi_poly& p0) {
int fail = 0; int fail = 0;
int last_fail; int last_fail;
for(auto& h: all) models::apply_ori(h); for(auto& h: all) models::scr_to_ori(h);
auto break_in_xz = [&] (hyperpoint a, hyperpoint b, int xcoord, int zcoord) { auto break_in_xz = [&] (hyperpoint a, hyperpoint b, int xcoord, int zcoord) {
return a[xcoord] * b[xcoord] <= 0 && (a[xcoord] * (b[zcoord]+zlow) - b[xcoord] * (a[zcoord]+zlow)) * (a[xcoord] - b[xcoord]) < 0; return a[xcoord] * b[xcoord] <= 0 && (a[xcoord] * (b[zcoord]+zlow) - b[xcoord] * (a[zcoord]+zlow)) * (a[xcoord] - b[xcoord]) < 0;
@ -1708,7 +1708,7 @@ bool broken_projection(dqi_poly& p0) {
/* we don't rotate h's back, just change p.V */ /* we don't rotate h's back, just change p.V */
for(int i=0; i<3; i++) for(int i=0; i<3; i++)
models::apply_ori(p.V.T[i]); models::scr_to_ori(p.V.T[i]);
if(fail) { if(fail) {
if(p0.tinf) return true; if(p0.tinf) return true;
@ -1891,8 +1891,8 @@ void dqi_poly::draw() {
shiftpoint h2 = V * glhr::gltopoint((*tab)[offset+(i+1)%cnt]); shiftpoint h2 = V * glhr::gltopoint((*tab)[offset+(i+1)%cnt]);
hyperpoint ah1 = h1.h, ah2 = h2.h; hyperpoint ah1 = h1.h, ah2 = h2.h;
models::apply_ori(ah1); models::scr_to_ori(ah1);
models::apply_ori(ah2); models::scr_to_ori(ah2);
if(ah1[1] * ah2[1] > 0) continue; if(ah1[1] * ah2[1] > 0) continue;
ld c1 = ah1[1], c2 = -ah2[1]; ld c1 = ah1[1], c2 = -ah2[1];
if(c1 < 0) c1 = -c1, c2 = -c2; if(c1 < 0) c1 = -c1, c2 = -c2;

View File

@ -3402,9 +3402,9 @@ EX void drawaura() {
if(joukowsky) { if(joukowsky) {
hyperpoint v(c, s, 0, 1); hyperpoint v(c, s, 0, 1);
if(inversion) if(inversion)
models::apply_iori(v); models::ori_to_scr(v);
else else
models::apply_ori(v); models::scr_to_ori(v);
ld c1 = v[0], s1 = v[1]; ld c1 = v[0], s1 = v[1];
ld& mt = pconf.model_transition; ld& mt = pconf.model_transition;

View File

@ -253,7 +253,7 @@ void move_y_to_z(hyperpoint& H, pair<ld, ld> coef) {
template<class T> void makeband(shiftpoint H, hyperpoint& ret, const T& f) { template<class T> void makeband(shiftpoint H, hyperpoint& ret, const T& f) {
ld zlev = find_zlev(H.h); ld zlev = find_zlev(H.h);
models::apply_ori(H.h); models::scr_to_ori(H.h);
auto r = move_z_to_y(H.h); auto r = move_z_to_y(H.h);
ld x, y, yf, zf=0; ld x, y, yf, zf=0;
@ -271,7 +271,7 @@ template<class T> void makeband(shiftpoint H, hyperpoint& ret, const T& f) {
ld yzf = y * zf; y *= yf; ld yzf = y * zf; y *= yf;
ret = hpxyz(x / M_PI, y / M_PI, 0); ret = hpxyz(x / M_PI, y / M_PI, 0);
move_y_to_z(ret, r); move_y_to_z(ret, r);
models::apply_iori(ret); models::ori_to_scr(ret);
if(zlev != 1 && use_z_coordinate()) if(zlev != 1 && use_z_coordinate())
apply_depth(ret, yzf / M_PI); apply_depth(ret, yzf / M_PI);
return; return;
@ -395,9 +395,9 @@ EX void apply_perspective(const hyperpoint& H, hyperpoint& ret) {
EX void apply_nil_rotation(hyperpoint& H) { EX void apply_nil_rotation(hyperpoint& H) {
if(nil) { if(nil) {
nilv::convert_ref(H, nilv::model_used, nilv::nmSym); nilv::convert_ref(H, nilv::model_used, nilv::nmSym);
models::apply_ori(H); models::scr_to_ori(H);
nilv::convert_ref(H, nilv::nmSym, pconf.rotational_nil); nilv::convert_ref(H, nilv::nmSym, pconf.rotational_nil);
models::apply_iori(H); models::ori_to_scr(H);
} }
} }
@ -452,7 +452,7 @@ EX void threepoint_projection(const hyperpoint& H, hyperpoint& ret) {
hyperpoint H1 = H; hyperpoint H1 = H;
find_zlev(H1); find_zlev(H1);
if(true) { if(true) {
models::apply_ori(H1); models::scr_to_ori(H1);
} }
auto p = pconf.twopoint_param; auto p = pconf.twopoint_param;
@ -498,14 +498,14 @@ EX void threepoint_projection(const hyperpoint& H, hyperpoint& ret) {
geometry = gCubeTiling; geometry = gCubeTiling;
ret = sxy; ret = sxy;
models::apply_iori(ret); models::ori_to_scr(ret);
} }
#endif #endif
EX vector<hr::function<void(shiftpoint& H_orig, hyperpoint& H, hyperpoint& ret)>> extra_projections; EX vector<hr::function<void(shiftpoint& H_orig, hyperpoint& H, hyperpoint& ret)>> extra_projections;
EX void make_axial(hyperpoint H, hyperpoint& ret, const hr::function<ld(hyperpoint)>& f) { EX void make_axial(hyperpoint H, hyperpoint& ret, const hr::function<ld(hyperpoint)>& f) {
models::apply_ori(H); models::scr_to_ori(H);
ret[0] = f(H); ret[0] = f(H);
ld axi = pconf.axial_angle; ld axi = pconf.axial_angle;
@ -526,7 +526,7 @@ EX void make_axial(hyperpoint H, hyperpoint& ret, const hr::function<ld(hyperpoi
ret[3] = 1; ret[3] = 1;
models::apply_iori(ret); models::ori_to_scr(ret);
} }
// according to https://github.com/cspersonal/peirce-quincuncial-projection/blob/master/peirceQuincuncialProjection.R // according to https://github.com/cspersonal/peirce-quincuncial-projection/blob/master/peirceQuincuncialProjection.R
@ -649,7 +649,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
#endif #endif
if(!computing_semidirect) S = lp_apply(S); if(!computing_semidirect) S = lp_apply(S);
if(hyperbolic) { if(hyperbolic) {
models::apply_iori(ret); models::ori_to_scr(ret);
} }
apply_perspective(S, ret); apply_perspective(S, ret);
return; return;
@ -744,7 +744,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ld zlev = find_zlev(H); ld zlev = find_zlev(H);
H = space_to_perspective(H); H = space_to_perspective(H);
models::apply_ori(H); models::scr_to_ori(H);
H[1] += 1; H[1] += 1;
double rad = sqhypot_d(GDIM, H); double rad = sqhypot_d(GDIM, H);
@ -758,11 +758,11 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret[1] = 1 + H[1]; ret[1] = 1 + H[1];
ret[2] = H[2]; ret[2] = H[2];
ret[3] = 1; ret[3] = 1;
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
models::apply_ori(H); models::scr_to_ori(H);
H *= pconf.halfplane_scale; H *= pconf.halfplane_scale;
auto ocos = pconf.mori().get()[0][0]; auto ocos = pconf.mori().get()[0][0];
@ -817,7 +817,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
case mdQuadrant: { case mdQuadrant: {
H = space_to_perspective(H); H = space_to_perspective(H);
models::apply_ori(H); models::scr_to_ori(H);
tie(H[0], H[1]) = make_pair((H[0] + H[1]) / sqrt(2), (H[1] - H[0]) / sqrt(2)); tie(H[0], H[1]) = make_pair((H[0] + H[1]) / sqrt(2), (H[1] - H[0]) / sqrt(2));
@ -832,7 +832,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret[0] = -H[1] * x - 1; ret[0] = -H[1] * x - 1;
ret[1] = H[1] / x + 1; ret[1] = H[1] / x + 1;
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -849,13 +849,13 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
apply_nil_rotation(H); apply_nil_rotation(H);
if(hyperbolic) models::apply_ori(H); if(hyperbolic) models::scr_to_ori(H);
ret = hyperbolic ? deparabolic13(H) : H; ret = hyperbolic ? deparabolic13(H) : H;
ret *= .5; ret *= .5;
ret[LDIM] = 1; ret[LDIM] = 1;
if(hyperbolic) models::apply_iori(ret); if(hyperbolic) models::ori_to_scr(ret);
if(!vrhr::rendering()) ret = lp_apply(ret); if(!vrhr::rendering()) ret = lp_apply(ret);
@ -864,24 +864,24 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
case mdHorocyclicEqa: { case mdHorocyclicEqa: {
if(hyperbolic) models::apply_ori(H); if(hyperbolic) models::scr_to_ori(H);
ret = hyperbolic ? deparabolic13(H) : H; ret = hyperbolic ? deparabolic13(H) : H;
ret[0] = exp(-ret[0]) - 1; ret[0] = exp(-ret[0]) - 1;
ret *= .5; ret *= .5;
ret[LDIM] = 1; ret[LDIM] = 1;
if(hyperbolic) models::apply_iori(ret); if(hyperbolic) models::ori_to_scr(ret);
break; break;
} }
case mdConformalSquare: { case mdConformalSquare: {
find_zlev(H); find_zlev(H);
models::apply_ori(H); models::scr_to_ori(H);
if(euclid) H[0] /= pconf.fisheye_param, H[1] /= pconf.fisheye_param; if(euclid) H[0] /= pconf.fisheye_param, H[1] /= pconf.fisheye_param;
ret = to_square(H); ret = to_square(H);
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -891,7 +891,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret *= .5; ret *= .5;
ret[LDIM] = 1; ret[LDIM] = 1;
if(hyperbolic) models::apply_iori(ret); if(hyperbolic) models::ori_to_scr(ret);
if(!vrhr::rendering()) ret = lp_apply(ret); if(!vrhr::rendering()) ret = lp_apply(ret);
@ -1054,7 +1054,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
} }
case mdSimulatedPerspective: { case mdSimulatedPerspective: {
models::apply_ori(H); models::scr_to_ori(H);
auto yz = move_z_to_y(H); auto yz = move_z_to_y(H);
hyperpoint Hl = xpush(-pconf.twopoint_param) * H; hyperpoint Hl = xpush(-pconf.twopoint_param) * H;
hyperpoint Hr = xpush(+pconf.twopoint_param) * H; hyperpoint Hr = xpush(+pconf.twopoint_param) * H;
@ -1073,25 +1073,25 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret[0] = -ret[0]; ret[1] = -ret[1]; ret[0] = -ret[0]; ret[1] = -ret[1];
move_y_to_z(ret, yz); move_y_to_z(ret, yz);
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
case mdTwoHybrid: { case mdTwoHybrid: {
models::apply_ori(H); models::scr_to_ori(H);
auto yz = move_z_to_y(H); auto yz = move_z_to_y(H);
ret = compute_hybrid(H, whateveri[0]); ret = compute_hybrid(H, whateveri[0]);
move_y_to_z(ret, yz); move_y_to_z(ret, yz);
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
case mdJoukowsky: case mdJoukowsky:
case mdJoukowskyInverted: { case mdJoukowskyInverted: {
models::apply_ori(H); models::scr_to_ori(H);
// with equal speed skiprope: models::apply_orientation(H[1], H[0]); // with equal speed skiprope: models::scr_to_orientation(H[1], H[0]);
if(pconf.skiprope) { if(pconf.skiprope) {
static ld last_skiprope = 0; static ld last_skiprope = 0;
@ -1151,7 +1151,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
else { else {
move_y_to_z(ret, yz); move_y_to_z(ret, yz);
} }
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -1160,14 +1160,14 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
H = space_to_perspective(H); H = space_to_perspective(H);
models::apply_ori(H); models::scr_to_ori(H);
pair<long double, long double> p = polygonal::compute(H[0], H[1]); pair<long double, long double> p = polygonal::compute(H[0], H[1]);
ret[0] = p.first; ret[0] = p.first;
ret[1] = p.second; ret[1] = p.second;
ret[2] = 0; ret[2] = 0;
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -1178,7 +1178,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
H = space_to_perspective(H); H = space_to_perspective(H);
models::apply_ori(H); models::scr_to_ori(H);
H[0] += 1; H[0] += 1;
double rad = H[0]*H[0] + H[1]*H[1]; double rad = H[0]*H[0] + H[1]*H[1];
@ -1199,7 +1199,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret[0] /= -(1-mt) * 90._deg; ret[0] /= -(1-mt) * 90._deg;
ret[1] /= (1-mt) * 90._deg; ret[1] /= (1-mt) * 90._deg;
models::apply_iori(ret); models::ori_to_scr(ret);
} }
else else
makeband(H_orig, ret, band_conformal); makeband(H_orig, ret, band_conformal);
@ -1296,7 +1296,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
case mdWerner: { case mdWerner: {
models::apply_ori(H); models::scr_to_ori(H);
find_zlev(H); // ignored for now find_zlev(H); // ignored for now
@ -1310,7 +1310,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret[2] = 0; ret[2] = 0;
ret[3] = 1; ret[3] = 1;
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -1382,7 +1382,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
case mdRotatedHyperboles: { case mdRotatedHyperboles: {
// ld zlev = <- not implemented // ld zlev = <- not implemented
find_zlev(H); // + vid.depth; find_zlev(H); // + vid.depth;
models::apply_ori(H); models::scr_to_ori(H);
ld y = asin_auto(H[1]); ld y = asin_auto(H[1]);
ld x = asin_auto_clamp(H[0] / cos_auto(y)); ld x = asin_auto_clamp(H[0] / cos_auto(y));
@ -1497,7 +1497,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
case mdPanini: { case mdPanini: {
find_zlev(H); find_zlev(H);
models::apply_ori(H); models::scr_to_ori(H);
ld proh = sqrt(H[2]*H[2] + curvature() * H[0] * H[0]); ld proh = sqrt(H[2]*H[2] + curvature() * H[0] * H[0]);
H /= proh; H /= proh;
@ -1505,7 +1505,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret = H; ret = H;
ret[2] = 0; ret[3] = 1; ret[2] = 0; ret[3] = 1;
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -1513,7 +1513,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
find_zlev(H); find_zlev(H);
H = space_to_perspective(H); H = space_to_perspective(H);
models::apply_ori(H); models::scr_to_ori(H);
ld u = H[0], v = H[1]; ld u = H[0], v = H[1];
if(abs(u) > 1e-3 && abs(v) > 1e-3) { if(abs(u) > 1e-3 && abs(v) > 1e-3) {
@ -1526,7 +1526,7 @@ EX void apply_other_model(shiftpoint H_orig, hyperpoint& ret, eModel md) {
ret[2] = 0; ret[2] = 0;
ret[3] = 1; ret[3] = 1;
models::apply_iori(ret); models::ori_to_scr(ret);
break; break;
} }
@ -2564,7 +2564,7 @@ EX void draw_model_elements() {
hyperpoint H = xpush(p * pconf.twopoint_param) * ypush0(h); hyperpoint H = xpush(p * pconf.twopoint_param) * ypush0(h);
hyperpoint res = compute_hybrid(H, 2 | mode); hyperpoint res = compute_hybrid(H, 2 | mode);
models::apply_iori(res); models::ori_to_scr(res);
curvepoint(res * current_display->radius); curvepoint(res * current_display->radius);
} }
queuecurve(shiftless(Id), ringcolor, 0, PPR::CIRCLE); queuecurve(shiftless(Id), ringcolor, 0, PPR::CIRCLE);
@ -2586,7 +2586,7 @@ EX void draw_model_elements() {
vid.linewidth *= 5; vid.linewidth *= 5;
for(int i=0; i<=3; i++) { for(int i=0; i<=3; i++) {
hyperpoint h = xspinpush0(120._deg*i, pconf.twopoint_param); hyperpoint h = xspinpush0(120._deg*i, pconf.twopoint_param);
models::apply_iori(h); models::ori_to_scr(h);
curvepoint(h); curvepoint(h);
} }
@ -2732,7 +2732,7 @@ EX void draw_boundary(int w) {
h[broken_coord] = -sin_auto(a*degree) * rem; h[broken_coord] = -sin_auto(a*degree) * rem;
h[0] = sin_auto(a*degree) * eps * s; h[0] = sin_auto(a*degree) * eps * s;
h[unbroken_coord] = cos_auto(a*degree); h[unbroken_coord] = cos_auto(a*degree);
models::apply_iori(h); models::ori_to_scr(h);
curvepoint(h); curvepoint(h);
} }
queuecurve(shiftless(Id), periodcolor, 0, PPR::CIRCLE).flags |= POLY_FORCEWIDE; queuecurve(shiftless(Id), periodcolor, 0, PPR::CIRCLE).flags |= POLY_FORCEWIDE;
@ -2753,13 +2753,13 @@ EX void draw_boundary(int w) {
ld y = 0; ld y = 0;
ld z = -sqrt(1 - x*x); ld z = -sqrt(1 - x*x);
hyperpoint h0 = hpxyz(x, y, z); hyperpoint h0 = hpxyz(x, y, z);
models::apply_iori(h0); models::ori_to_scr(h0);
hyperpoint h1; hyperpoint h1;
applymodel(shiftless(h0), h1); applymodel(shiftless(h0), h1);
models::apply_ori(h1); models::scr_to_ori(h1);
h1[1] = abs(h1[1]) * b; h1[1] = abs(h1[1]) * b;
models::apply_iori(h1); models::ori_to_scr(h1);
curvepoint(h1); curvepoint(h1);
} }
@ -3397,7 +3397,7 @@ EX hyperpoint lie_log(const shiftpoint h1) {
EX hyperpoint lie_log_correct(const shiftpoint H_orig, hyperpoint& H) { EX hyperpoint lie_log_correct(const shiftpoint H_orig, hyperpoint& H) {
find_zlev(H); find_zlev(H);
if(hyperbolic) { if(hyperbolic) {
models::apply_ori(H); models::scr_to_ori(H);
return lie_log(shiftless(H)); return lie_log(shiftless(H));
} }
return lie_log(H_orig); return lie_log(H_orig);

View File

@ -122,11 +122,13 @@ EX namespace models {
EX ld cos_ball, sin_ball; EX ld cos_ball, sin_ball;
EX bool model_straight, model_straight_yz; EX bool model_straight, model_straight_yz;
EX void apply_ori(hyperpoint& h) { if(!model_straight) h = pconf.mori().get() * h; } /** screen coordinates to orientation logical coordinates */
EX void apply_iori(hyperpoint& h) { if(!model_straight) h = iso_inverse(pconf.mori().get()) * h; } EX void ori_to_scr(hyperpoint& h) { if(!model_straight) h = pconf.mori().get() * h; }
/** orientation logical coordinates to screen coordinates */
EX void scr_to_ori(hyperpoint& h) { if(!model_straight) h = iso_inverse(pconf.mori().get()) * h; }
#if HDR #if HDR
// screen coordinates to logical coordinates: apply_orientation(x,y)
// logical coordinates back to screen coordinates: apply_orientation(y,x)
template<class A> template<class A>
void apply_ball(A& x, A& y) { tie(x,y) = make_pair(x*cos_ball + y*sin_ball, y*cos_ball - x*sin_ball); } void apply_ball(A& x, A& y) { tie(x,y) = make_pair(x*cos_ball + y*sin_ball, y*cos_ball - x*sin_ball); }
#endif #endif

View File

@ -59,7 +59,7 @@ glhr::glmatrix model_orientation_gl() {
for(int a=0; a<GDIM; a++) { for(int a=0; a<GDIM; a++) {
hyperpoint row; hyperpoint row;
for(int b=0; b<4; b++) row[b] = s[a][b]; for(int b=0; b<4; b++) row[b] = s[a][b];
models::apply_iori(row); models::ori_to_scr(row);
for(int b=0; b<4; b++) s[a][b] = row[b]; for(int b=0; b<4; b++) s[a][b] = row[b];
} }
return s; return s;
@ -791,7 +791,7 @@ void display_data::set_projection(int ed, ld shift) {
for(int a=0; a<4; a++) { for(int a=0; a<4; a++) {
hyperpoint row; hyperpoint row;
for(int b=0; b<4; b++) row[b] = pp[a][b]; for(int b=0; b<4; b++) row[b] = pp[a][b];
models::apply_ori(row); models::scr_to_ori(row);
for(int b=0; b<4; b++) pp[a][b] = row[b]; for(int b=0; b<4; b++) pp[a][b] = row[b];
} }
} }