From 416ee95aacf66e6356b30c12d9abb3f8881aa8fe Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 9 Nov 2019 12:49:00 +0100 Subject: [PATCH] horocyclic coordinates model --- classes.cpp | 1 + classes.h | 4 ++-- hypgraph.cpp | 19 +++++++++++++++++++ models.cpp | 7 +++---- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/classes.cpp b/classes.cpp index 0e9e11d6..55b38360 100644 --- a/classes.cpp +++ b/classes.cpp @@ -633,6 +633,7 @@ vector mdinf = { {X3("Mollweide"), mf::euc_boring | mf::pseudoband | mf::equiarea }, {X3("central cylindrical"), mf::euc_boring | mf::band }, {X3("Collignon"), mf::pseudoband | mf::equiarea }, + {X3("horocyclic coordinates"), mf::euc_boring }, {X3("guard"), 0}, {X3("polynomial"), mf::conformal} }; diff --git a/classes.h b/classes.h index 42a5d1fe..1847db03 100644 --- a/classes.h +++ b/classes.h @@ -312,8 +312,8 @@ enum eModel { // 20..24 mdEquivolume, mdCentralInversion, mdSimulatedPerspective, mdTwoHybrid, mdGeodesic, // 25 - mdMollweide, mdCentralCyl, mdCollignon, - // 26.. + mdMollweide, mdCentralCyl, mdCollignon, mdHorocyclic, + // 29.. mdGUARD, mdPixel, mdHyperboloidFlat, mdPolynomial, mdManual }; diff --git a/hypgraph.cpp b/hypgraph.cpp index 3794b449..68bcc8ce 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -444,6 +444,25 @@ EX void applymodel(hyperpoint H, hyperpoint& ret) { break; } + case mdHorocyclic: { + + find_zlev(H); + + models::apply_orientation_yz(H[1], H[2]); + models::apply_orientation(H[0], H[1]); + + ret = hyperbolic ? deparabolic10(H) : H; + ret *= .5; + ret[LDIM] = 1; + + models::apply_orientation(ret[1], ret[0]); + models::apply_orientation_yz(ret[2], ret[1]); + + if(nonisotropic) ret = lp_apply(ret); + + break; + } + case mdHemisphere: { switch(cgclass) { diff --git a/models.cpp b/models.cpp index 5dc067fe..6b4cae66 100644 --- a/models.cpp +++ b/models.cpp @@ -200,7 +200,7 @@ EX namespace models { EX bool model_available(eModel pm) { if(prod) return pm == mdPerspective; if(sl2) return pm == mdGeodesic; - if(nonisotropic) return among(pm, mdDisk, mdPerspective, mdHyperboloid, mdGeodesic, mdEquidistant, mdFisheye); + if(nonisotropic) return among(pm, mdDisk, mdPerspective, mdHorocyclic, mdGeodesic, mdEquidistant, mdFisheye); if(pm == mdGeodesic && !sol) return false; if(sphere && (pm == mdHalfplane || pm == mdBall)) return false; @@ -213,7 +213,7 @@ EX namespace models { EX bool model_has_orientation() { return - among(pmodel, mdHalfplane, mdPolynomial, mdPolygonal, mdTwoPoint, mdJoukowsky, mdJoukowskyInverted, mdSpiral, mdSimulatedPerspective, mdTwoHybrid) || mdBandAny(); + among(pmodel, mdHalfplane, mdPolynomial, mdPolygonal, mdTwoPoint, mdJoukowsky, mdJoukowskyInverted, mdSpiral, mdSimulatedPerspective, mdTwoHybrid, mdHorocyclic) || mdBandAny(); } EX bool model_has_transition() { @@ -226,10 +226,9 @@ EX namespace models { if(m == mdDisk && GDIM == 3 && (hyperbolic || nonisotropic)) return XLAT("ball model/Gans"); if(m == mdPerspective && prod) return XLAT("native perspective"); if(nonisotropic) { - if(m == mdHyperboloid) return XLAT("simple model: projection"); if(m == mdPerspective) return XLAT("simple model: perspective"); if(m == mdGeodesic) return XLAT("native perspective"); - if(m == mdEquidistant || m == mdFisheye) return XLAT(mdinf[m].name_hyperbolic); + if(among(m, mdEquidistant, mdFisheye, mdHorocyclic)) return XLAT(mdinf[m].name_hyperbolic); } if(m == mdDisk && GDIM == 3) return XLAT("perspective in 4D"); if(m == mdHalfplane && GDIM == 3 && hyperbolic) return XLAT("half-space");