mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
Archimedean precise analyzer
This commit is contained in:
parent
142566a5bd
commit
f6f37b1e45
@ -73,6 +73,8 @@ struct archimedean_tiling {
|
|||||||
geometryinfo1& get_geometry();
|
geometryinfo1& get_geometry();
|
||||||
eGeometryClass get_class() { return get_geometry().kind; }
|
eGeometryClass get_class() { return get_geometry().kind; }
|
||||||
|
|
||||||
|
bool get_step_values(int& steps, int& single_step);
|
||||||
|
|
||||||
ld scale();
|
ld scale();
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -1232,6 +1234,10 @@ EX void show() {
|
|||||||
}
|
}
|
||||||
else dialog::addBreak(100);
|
else dialog::addBreak(100);
|
||||||
|
|
||||||
|
int s, ss;
|
||||||
|
bool b = current.get_step_values(s, ss);
|
||||||
|
println(hlog, "b=", b, " s=", s, " ss=",ss);
|
||||||
|
|
||||||
if(archimedean) {
|
if(archimedean) {
|
||||||
dialog::addSelItem(XLAT("variations"), gp::operation_name(), 'v');
|
dialog::addSelItem(XLAT("variations"), gp::operation_name(), 'v');
|
||||||
dialog::add_action(next_variation);
|
dialog::add_action(next_variation);
|
||||||
@ -1301,6 +1307,26 @@ EX bool is_vertex(heptagon *h) {
|
|||||||
return id_of(h) >= 2 * current.N;
|
return id_of(h) >= 2 * current.N;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool archimedean_tiling::get_step_values(int& steps, int& single_step) {
|
||||||
|
|
||||||
|
int nom = -2;
|
||||||
|
int denom = 1;
|
||||||
|
|
||||||
|
for(int f: arcm::current.faces) {
|
||||||
|
if(int(denom*f)/f != denom) { steps = 0; single_step = 0; return false; }
|
||||||
|
nom = nom * f + (f-2) * denom;
|
||||||
|
denom = denom * f;
|
||||||
|
int g = gcd(nom, denom);
|
||||||
|
nom /= g;
|
||||||
|
denom /= g;
|
||||||
|
}
|
||||||
|
|
||||||
|
steps = 2 * abs(denom);
|
||||||
|
single_step = abs(nom);
|
||||||
|
if(steps/2 != abs(denom)) return false;
|
||||||
|
return (2 * denom) % nom == 0;
|
||||||
|
}
|
||||||
|
|
||||||
EX int valence() {
|
EX int valence() {
|
||||||
if(PURE) return arcm::current.N;
|
if(PURE) return arcm::current.N;
|
||||||
if(BITRUNCATED) return 3;
|
if(BITRUNCATED) return 3;
|
||||||
|
12
geom-exp.cpp
12
geom-exp.cpp
@ -444,7 +444,17 @@ void ge_select_tiling(const vector<eGeometry>& lst) {
|
|||||||
if(archimedean) ok = PURE;
|
if(archimedean) ok = PURE;
|
||||||
else if(binarytiling || penrose) ok = false;
|
else if(binarytiling || penrose) ok = false;
|
||||||
else ok = PURE || BITRUNCATED;
|
else ok = PURE || BITRUNCATED;
|
||||||
if(!ok) addMessage(XLAT("Only works with (semi-)regular tilings"));
|
if(!ok) {
|
||||||
|
addMessage(XLAT("Only works with (semi-)regular tilings"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(archimedean) {
|
||||||
|
int steps, single_step;
|
||||||
|
if(!arcm::current.get_step_values(steps, single_step)) {
|
||||||
|
addMessage(XLAT("That would have %1/%2 levels", its(steps), its(single_step)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
set_geometry(targetgeometry);
|
set_geometry(targetgeometry);
|
||||||
start_game();
|
start_game();
|
||||||
|
@ -576,12 +576,8 @@ void geometry_information::prepare_basics() {
|
|||||||
steps = 0;
|
steps = 0;
|
||||||
single_step = 1;
|
single_step = 1;
|
||||||
if(hybri && !prod) {
|
if(hybri && !prod) {
|
||||||
if(hybrid::underlying == gArchimedean) {
|
if(hybrid::underlying == gArchimedean)
|
||||||
ld s = arcm::current.euclidean_angle_sum - 2;
|
arcm::current.get_step_values(steps, single_step);
|
||||||
single_step = 2;
|
|
||||||
DEBB(DF_GEOM | DF_POLY, ("1/s = ", 1/s));
|
|
||||||
steps = 4/abs(s) + .5;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
single_step = S3 * S7 - 2 * S7 - 2 * S3;
|
single_step = S3 * S7 - 2 * S7 - 2 * S3;
|
||||||
steps = 2 * S7;
|
steps = 2 * S7;
|
||||||
|
Loading…
Reference in New Issue
Block a user