mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-24 01:00:25 +00:00
moved circumscribe and other functions from irregular.cpp to hyperpoint.cpp
This commit is contained in:
parent
2a7d932703
commit
ccc82866a9
@ -1583,4 +1583,66 @@ EX hyperpoint linecross(hyperpoint a, hyperpoint b, hyperpoint c, hyperpoint d)
|
||||
return normalize(res);
|
||||
}
|
||||
|
||||
EX ld inner2(hyperpoint h1, hyperpoint h2) {
|
||||
return
|
||||
hyperbolic ? h1[LDIM] * h2[LDIM] - h1[0] * h2[0] - h1[1] * h2[1] :
|
||||
sphere ? h1[LDIM] * h2[LDIM] + h1[0] * h2[0] + h1[1] * h2[1] :
|
||||
h1[0] * h2[0] + h1[1] * h2[1];
|
||||
}
|
||||
|
||||
EX hyperpoint circumscribe(hyperpoint a, hyperpoint b, hyperpoint c) {
|
||||
hyperpoint h = C0;
|
||||
|
||||
b = b - a;
|
||||
c = c - a;
|
||||
|
||||
if(euclid) {
|
||||
ld b2 = inner2(b, b)/2;
|
||||
ld c2 = inner2(c, c)/2;
|
||||
|
||||
ld det = c[1]*b[0] - b[1]*c[0];
|
||||
|
||||
h = a;
|
||||
|
||||
h[1] += (c2*b[0] - b2 * c[0]) / det;
|
||||
h[0] += (c2*b[1] - b2 * c[1]) / -det;
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
if(inner2(b,b) < 0) {
|
||||
b = b / sqrt(-inner2(b, b));
|
||||
c = c + b * inner2(c, b);
|
||||
h = h + b * inner2(h, b);
|
||||
}
|
||||
else {
|
||||
b = b / sqrt(inner2(b, b));
|
||||
c = c - b * inner2(c, b);
|
||||
h = h - b * inner2(h, b);
|
||||
}
|
||||
|
||||
if(inner2(c,c) < 0) {
|
||||
c = c / sqrt(-inner2(c, c));
|
||||
h = h + c * inner2(h, c);
|
||||
}
|
||||
else {
|
||||
c = c / sqrt(inner2(c, c));
|
||||
h = h - c * inner2(h, c);
|
||||
}
|
||||
|
||||
if(h[LDIM] < 0) h[0] = -h[0], h[1] = -h[1], h[LDIM] = -h[LDIM];
|
||||
|
||||
ld i = inner2(h, h);
|
||||
if(i > 0) h /= sqrt(i);
|
||||
else h /= -sqrt(-i);
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
EX bool clockwise(hyperpoint h1, hyperpoint h2) {
|
||||
return h1[0] * h2[1] > h1[1] * h2[0];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -42,66 +42,6 @@ EX map<cell*, int> cellindex;
|
||||
|
||||
EX vector<cellinfo> cells;
|
||||
|
||||
ld inner(hyperpoint h1, hyperpoint h2) {
|
||||
return
|
||||
hyperbolic ? h1[LDIM] * h2[LDIM] - h1[0] * h2[0] - h1[1] * h2[1] :
|
||||
sphere ? h1[LDIM] * h2[LDIM] + h1[0] * h2[0] + h1[1] * h2[1] :
|
||||
h1[0] * h2[0] + h1[1] * h2[1];
|
||||
}
|
||||
|
||||
hyperpoint circumscribe(hyperpoint a, hyperpoint b, hyperpoint c) {
|
||||
hyperpoint h = C0;
|
||||
|
||||
b = b - a;
|
||||
c = c - a;
|
||||
|
||||
if(euclid) {
|
||||
ld b2 = inner(b, b)/2;
|
||||
ld c2 = inner(c, c)/2;
|
||||
|
||||
ld det = c[1]*b[0] - b[1]*c[0];
|
||||
|
||||
h = a;
|
||||
|
||||
h[1] += (c2*b[0] - b2 * c[0]) / det;
|
||||
h[0] += (c2*b[1] - b2 * c[1]) / -det;
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
if(inner(b,b) < 0) {
|
||||
b = b / sqrt(-inner(b, b));
|
||||
c = c + b * inner(c, b);
|
||||
h = h + b * inner(h, b);
|
||||
}
|
||||
else {
|
||||
b = b / sqrt(inner(b, b));
|
||||
c = c - b * inner(c, b);
|
||||
h = h - b * inner(h, b);
|
||||
}
|
||||
|
||||
if(inner(c,c) < 0) {
|
||||
c = c / sqrt(-inner(c, c));
|
||||
h = h + c * inner(h, c);
|
||||
}
|
||||
else {
|
||||
c = c / sqrt(inner(c, c));
|
||||
h = h - c * inner(h, c);
|
||||
}
|
||||
|
||||
if(h[LDIM] < 0) h[0] = -h[0], h[1] = -h[1], h[LDIM] = -h[LDIM];
|
||||
|
||||
ld i = inner(h, h);
|
||||
if(i > 0) h /= sqrt(i);
|
||||
else h /= -sqrt(-i);
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
bool clockwise(hyperpoint h1, hyperpoint h2) {
|
||||
return h1[0] * h2[1] > h1[1] * h2[0];
|
||||
}
|
||||
|
||||
EX map<heptagon*, vector<int> > cells_of_heptagon;
|
||||
|
||||
int runlevel;
|
||||
|
Loading…
Reference in New Issue
Block a user