mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-26 15:12:48 +00:00
more accurate mouse when in 2D projections
This commit is contained in:
parent
fc9adf8960
commit
d09acee7a8
39
hypgraph.cpp
39
hypgraph.cpp
@ -8,16 +8,15 @@
|
|||||||
#include "hyper.h"
|
#include "hyper.h"
|
||||||
namespace hr {
|
namespace hr {
|
||||||
|
|
||||||
ld ghx, ghy, ghgx, ghgy;
|
hyperpoint ghxy, ghgxy, ghpm = C0;
|
||||||
hyperpoint ghpm = C0;
|
|
||||||
|
|
||||||
#if HDR
|
#if HDR
|
||||||
inline bool sphereflipped() { return sphere && pconf.alpha > 1.1 && GDIM == 3; }
|
inline bool sphereflipped() { return sphere && pconf.alpha > 1.1 && GDIM == 3; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ghcheck(hyperpoint &ret, const hyperpoint &H) {
|
void ghcheck(hyperpoint &ret, const hyperpoint &H) {
|
||||||
if(hypot(ret[0]-ghx, ret[1]-ghy) < hypot(ghgx-ghx, ghgy-ghy)) {
|
if(hypot_d(2, ret-ghxy) < hypot_d(2, ghgxy-ghxy)) {
|
||||||
ghpm = H; ghgx = ret[0]; ghgy = ret[1];
|
ghpm = H; ghgxy = ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,10 +88,38 @@ EX hyperpoint gethyper(ld x, ld y) {
|
|||||||
|
|
||||||
ld hx = (x - current_display->xcenter) / current_display->radius;
|
ld hx = (x - current_display->xcenter) / current_display->radius;
|
||||||
ld hy = (y - current_display->ycenter) / current_display->radius / pconf.stretch;
|
ld hy = (y - current_display->ycenter) / current_display->radius / pconf.stretch;
|
||||||
|
hyperpoint hxy = point3(hx, hy, 0);
|
||||||
|
|
||||||
if(pmodel) {
|
if(pmodel) {
|
||||||
ghx = hx, ghy = hy;
|
ghxy = hxy;
|
||||||
return ghpm;
|
|
||||||
|
transmatrix T = rgpushxto0(ghpm);
|
||||||
|
|
||||||
|
auto distance_at = [&] (const transmatrix& T1) {
|
||||||
|
hyperpoint h1;
|
||||||
|
applymodel(tC0(T1), h1);
|
||||||
|
return sqhypot_d(2, hxy - h1);
|
||||||
|
};
|
||||||
|
|
||||||
|
ld best = distance_at(T);
|
||||||
|
|
||||||
|
for(int it=0; it<50; it++)
|
||||||
|
for(int s=0; s<4; s++) {
|
||||||
|
transmatrix T1 = T * spin(s * quarter_circle) * xpush(pow(1.2, -it));
|
||||||
|
ld dist = distance_at(T1);
|
||||||
|
if(dist < best) best = dist, T = T1;
|
||||||
|
if(mdBandAny()) {
|
||||||
|
band_shift += 2 * M_PI;
|
||||||
|
dist = distance_at(T1);
|
||||||
|
if(dist < best) best = dist, T = T1;
|
||||||
|
band_shift -= 4 * M_PI;
|
||||||
|
dist = distance_at(T1);
|
||||||
|
if(dist < best) best = dist, T = T1;
|
||||||
|
band_shift += 2 * M_PI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tC0(T);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pconf.camera_angle) camrotate(hx, hy);
|
if(pconf.camera_angle) camrotate(hx, hy);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user