mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-09-28 22:10:40 +00:00
horo_distance used in virtualRebase
This commit is contained in:
parent
8ac431a7f1
commit
d4ce6c36aa
@ -210,6 +210,34 @@ transmatrix calc_relative_matrix_help(cell *c, heptagon *h1) {
|
|||||||
return gm * where;
|
return gm * where;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct horo_distance {
|
||||||
|
ld a, b;
|
||||||
|
horo_distance(hyperpoint h1) {
|
||||||
|
if(binarytiling) {
|
||||||
|
b = intval(h1, C0);
|
||||||
|
a = abs(binary::horo_level(h1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
a = 0, b = intval(h1, C0);
|
||||||
|
}
|
||||||
|
horo_distance(hyperpoint h1, const transmatrix& T) {
|
||||||
|
if(binarytiling) {
|
||||||
|
hyperpoint ih1 = inverse(T) * h1;
|
||||||
|
b = intval(ih1, C0);
|
||||||
|
a = abs(binary::horo_level(ih1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
a = 0, b = intval(h1, tC0(T));
|
||||||
|
}
|
||||||
|
bool operator < (const horo_distance z) {
|
||||||
|
if(binarytiling) {
|
||||||
|
if(a < z.a-1e-6) return true;
|
||||||
|
if(a > z.a+1e-6) return false;
|
||||||
|
}
|
||||||
|
return b < z.b - 1e-4;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<class T, class U>
|
template<class T, class U>
|
||||||
void virtualRebase(cell*& base, T& at, bool tohex, const U& check) {
|
void virtualRebase(cell*& base, T& at, bool tohex, const U& check) {
|
||||||
if((euclid || sphere) && DIM == 2) {
|
if((euclid || sphere) && DIM == 2) {
|
||||||
@ -241,7 +269,7 @@ void virtualRebase(cell*& base, T& at, bool tohex, const U& check) {
|
|||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
|
|
||||||
double currz = hdist0(check(at));
|
horo_distance currz(check(at));
|
||||||
|
|
||||||
heptagon *h = base->master;
|
heptagon *h = base->master;
|
||||||
|
|
||||||
@ -253,7 +281,7 @@ void virtualRebase(cell*& base, T& at, bool tohex, const U& check) {
|
|||||||
heptspin hs(h, d, false);
|
heptspin hs(h, d, false);
|
||||||
heptspin hs2 = hs + wstep;
|
heptspin hs2 = hs + wstep;
|
||||||
transmatrix V2 = spin(-hs2.spin*2*M_PI/S7) * invheptmove[d];
|
transmatrix V2 = spin(-hs2.spin*2*M_PI/S7) * invheptmove[d];
|
||||||
double newz = hdist0(check(V2 * at));
|
horo_distance newz(check(V2 * at));
|
||||||
if(newz < currz) {
|
if(newz < currz) {
|
||||||
currz = newz;
|
currz = newz;
|
||||||
bestV = V2;
|
bestV = V2;
|
||||||
@ -269,7 +297,7 @@ void virtualRebase(cell*& base, T& at, bool tohex, const U& check) {
|
|||||||
if(tohex && BITRUNCATED) for(int d=0; d<S7; d++) {
|
if(tohex && BITRUNCATED) for(int d=0; d<S7; d++) {
|
||||||
cell *c = createMov(base, d);
|
cell *c = createMov(base, d);
|
||||||
transmatrix V2 = spin(-base->c.spin(d)*2*M_PI/S6) * invhexmove[d];
|
transmatrix V2 = spin(-base->c.spin(d)*2*M_PI/S6) * invhexmove[d];
|
||||||
double newz = hdist0(check(V2 *at));
|
horo_distance newz(check(V2 * at));
|
||||||
if(newz < currz) {
|
if(newz < currz) {
|
||||||
currz = newz;
|
currz = newz;
|
||||||
bestV = V2;
|
bestV = V2;
|
||||||
@ -286,8 +314,8 @@ void virtualRebase(cell*& base, T& at, bool tohex, const U& check) {
|
|||||||
newbase = NULL;
|
newbase = NULL;
|
||||||
forCellCM(c2, base) {
|
forCellCM(c2, base) {
|
||||||
transmatrix V2 = calc_relative_matrix(base, c2, C0);
|
transmatrix V2 = calc_relative_matrix(base, c2, C0);
|
||||||
double newz = hdist0(check(V2 * at));
|
horo_distance newz(check(V2 * at));
|
||||||
if(newz < currz - 1e-4) {
|
if(newz < currz) {
|
||||||
currz = newz;
|
currz = newz;
|
||||||
bestV = V2;
|
bestV = V2;
|
||||||
newbase = c2;
|
newbase = c2;
|
||||||
|
24
shmup.cpp
24
shmup.cpp
@ -974,33 +974,13 @@ typedef multimap<cell*, monster*>::iterator mit;
|
|||||||
|
|
||||||
vector<monster*> active, nonvirtual, additional;
|
vector<monster*> active, nonvirtual, additional;
|
||||||
|
|
||||||
struct horo_distance {
|
|
||||||
ld a, b;
|
|
||||||
horo_distance(hyperpoint h1, cell *c) {
|
|
||||||
if(binarytiling) {
|
|
||||||
hyperpoint ih1 = inverse(ggmatrix(c)) * h1;
|
|
||||||
b = intval(ih1, C0);
|
|
||||||
a = abs(binary::horo_level(ih1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
a = 0, b = intval(h1, tC0(ggmatrix(c)));
|
|
||||||
}
|
|
||||||
bool operator < (const horo_distance z) {
|
|
||||||
if(binarytiling) {
|
|
||||||
if(a < z.a-1e-6) return true;
|
|
||||||
if(a > z.a+1e-6) return false;
|
|
||||||
}
|
|
||||||
return b < z.b;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
cell *findbaseAround(hyperpoint p, cell *around) {
|
cell *findbaseAround(hyperpoint p, cell *around) {
|
||||||
cell *best = around;
|
cell *best = around;
|
||||||
horo_distance d0(p, around);
|
horo_distance d0(p, ggmatrix(around));
|
||||||
for(int i=0; i<around->type; i++) {
|
for(int i=0; i<around->type; i++) {
|
||||||
cell *c2 = around->move(i);
|
cell *c2 = around->move(i);
|
||||||
if(c2) {
|
if(c2) {
|
||||||
horo_distance d1(p, c2);
|
horo_distance d1(p, ggmatrix(c2));
|
||||||
if(d1 < d0) { best = c2; d0 = d1; }
|
if(d1 < d0) { best = c2; d0 = d1; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user