solve vertex table only once

This commit is contained in:
2019-09-16 13:41:35 -04:00
parent 29097afd13
commit f2f723aac8
4 changed files with 60 additions and 36 deletions

View File

@@ -27,11 +27,12 @@ struct Mults {
struct Table { struct Table {
const std::vector<int> gens; const std::vector<int> gens;
const Mults mults;
std::vector<int> gen_inds; std::vector<int> gen_inds;
std::vector<std::vector<int>> fwd; std::vector<std::vector<int>> fwd;
std::vector<std::vector<int>> rev; std::vector<std::vector<int>> rev;
explicit Table(std::vector<int> gens); explicit Table(std::vector<int> gens, Mults mults);
[[nodiscard]] int gen_index(int gen) const; [[nodiscard]] int gen_index(int gen) const;
@@ -80,6 +81,10 @@ struct IRow {
Table *solve(const std::vector<int> &gens, const std::vector<int> &subgens, const Mults &mults); Table *solve(const std::vector<int> &gens, const std::vector<int> &subgens, const Mults &mults);
Table *solve(const std::vector<int> &subgens, const Mults &mults);
Table *solve_elems(const Mults &mults);
Mults schlafli(const std::vector<int> &symbol); Mults schlafli(const std::vector<int> &symbol);
std::vector<int> all_gens(int N); std::vector<int> all_gens(int N);

View File

@@ -52,25 +52,34 @@ public:
u_view = glGetUniformLocation(program, "view"); u_view = glGetUniformLocation(program, "view");
u_color = glGetUniformLocation(program, "color"); u_color = glGetUniformLocation(program, "color");
const Mults &mults = schlafli({3, 3, 5}); const Mults &mults = schlafli({5,3,3});
// const glm::vec4 ident = center(mults); // const glm::vec4 ident = center(mults);
const glm::vec4 ident = identity(mults, {10, 1, 1, 1}); const glm::vec4 ident = identity(mults, {1,});
std::cout << "Dimension: " << mults.num_gens << std::endl; std::cout << "Dimension: " << mults.num_gens << std::endl;
std::cout << "Generation times: " << std::endl; std::cout << "Generation times: " << std::endl;
auto gen_start = std::chrono::high_resolution_clock::now(); auto gen_start = std::chrono::high_resolution_clock::now();
vert_data = vertices(mults, ident); const Table *t_vert = solve_elems(mults);
auto gen_solve = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> solve_time = gen_solve - gen_start;
std::cout
<< "Table: "
<< std::setw(5) << std::setprecision(3) << solve_time.count()
<< std::endl;
vert_data = vertices(t_vert, ident);
auto gen_vert = std::chrono::high_resolution_clock::now(); auto gen_vert = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> vert_time = gen_vert - gen_start; std::chrono::duration<double> vert_time = gen_vert - gen_solve;
std::cout std::cout
<< "Vertices: " << "Vertices: "
<< std::setw(5) << std::setprecision(3) << vert_time.count() << std::setw(5) << std::setprecision(3) << vert_time.count()
<< " (" << vert_data.size() << ")" << " (" << vert_data.size() << ")"
<< std::endl; << std::endl;
edge_data = edges(mults); edge_data = edges(t_vert);
auto gen_edge = std::chrono::high_resolution_clock::now(); auto gen_edge = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> edge_time = gen_edge - gen_vert; std::chrono::duration<double> edge_time = gen_edge - gen_vert;
std::cout std::cout
@@ -79,7 +88,7 @@ public:
<< " (" << edge_data.size() / 2 << ")" << " (" << edge_data.size() / 2 << ")"
<< std::endl; << std::endl;
face_data = faces(mults); face_data = faces(t_vert);
auto gen_face = std::chrono::high_resolution_clock::now(); auto gen_face = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> face_time = gen_face - gen_edge; std::chrono::duration<double> face_time = gen_face - gen_edge;
std::cout std::cout
@@ -147,8 +156,20 @@ public:
const float sc = 1.5f; const float sc = 1.5f;
const float ar = (float) w / (float) h; const float ar = (float) w / (float) h;
const float c1 = std::cos(angle * .7);
const float s1 = std::sin(angle * .7);
const float c2 = std::cos(angle * .5);
const float s2 = std::sin(angle * .5);
const glm::mat4 proj = glm::ortho(-ar * sc, ar * sc, -sc, sc, -10.f, 10.f); const glm::mat4 proj = glm::ortho(-ar * sc, ar * sc, -sc, sc, -10.f, 10.f);
const glm::mat4 view = glm::rotate(id, angle, ax_1) * glm::rotate(id, angle, ax_2); const glm::mat4 view = glm::rotate(id, angle, ax_1) * glm::rotate(id, angle, ax_2)
* glm::mat4(
c1, 0.0, s1, 0.0,
0.0, c2, 0.0, s2,
-s1, 0.0, c1, 0.0,
0.0, -s2, 0.0, c2
)
;
glUseProgram(program); glUseProgram(program);
glUniformMatrix4fv(u_proj, 1, false, glm::value_ptr(proj)); glUniformMatrix4fv(u_proj, 1, false, glm::value_ptr(proj));
@@ -166,16 +187,20 @@ public:
glBindVertexArray(vert_vao); glBindVertexArray(vert_vao);
glUniform4f(u_color, 1, 0, 0, 1); glUniform4f(u_color, 1, 0, 0, 1);
// glDrawArrays(GL_POINTS, 0, vert_data.size()); glDrawArrays(GL_POINTS, 0, vert_data.size());
glBindVertexArray(edge_vao); glBindVertexArray(edge_vao);
glUniform4f(u_color, 1, 0, 0, 1); glUniform4f(u_color, 1, 0, 0, 1);
glDrawElements(GL_LINES, edge_data.size(), GL_UNSIGNED_INT, 0); glDrawElements(GL_LINES, edge_data.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(face_vao); glBindVertexArray(face_vao);
glCullFace(GL_FRONT); glCullFace(GL_NONE);
glUniform4f(u_color, 1, 1, 1, 1); glUniform4f(u_color, 1, 1, 1, 1);
glDrawElements(GL_TRIANGLES, face_data.size(), GL_UNSIGNED_INT, 0); // glDrawElements(GL_TRIANGLES, face_data.size(), GL_UNSIGNED_INT, 0);
// glCullFace(GL_FRONT);
// glUniform4f(u_color, .3, .3, 1, 1);
// glDrawElements(GL_TRIANGLES, face_data.size(), GL_UNSIGNED_INT, 0);
swapbuffers(); swapbuffers();
} }

View File

@@ -53,7 +53,7 @@ std::vector<std::vector<int>> Mults::irelations(Table *table, std::vector<int> g
return irels; return irels;
} }
Table::Table(const std::vector<int> gens) : gens(gens) { Table::Table(const std::vector<int> gens, const Mults mults) : gens(gens), mults(mults) {
add_row(); add_row();
gen_inds = std::vector<int>(gens[gens.size() - 1] + 1, -1); gen_inds = std::vector<int>(gens[gens.size() - 1] + 1, -1);
@@ -224,7 +224,7 @@ bool IRow::learn(Table *table) {
} }
Table *solve(const std::vector<int> &gens, const std::vector<int> &subgens, const Mults &mults) { Table *solve(const std::vector<int> &gens, const std::vector<int> &subgens, const Mults &mults) {
auto *table = new Table(gens); auto *table = new Table(gens, mults);
const auto irels = mults.irelations(table, gens); const auto irels = mults.irelations(table, gens);
for (int gen : subgens) for (int gen : subgens)
@@ -260,6 +260,14 @@ Table *solve(const std::vector<int> &gens, const std::vector<int> &subgens, cons
return table; return table;
} }
Table *solve(const std::vector<int> &subgens, const Mults &mults) {
return solve(all_gens(mults.num_gens), subgens, mults);
}
Table *solve_elems(const Mults &mults) {
return solve({}, mults);
}
Mults schlafli(const std::vector<int> &symbol) { Mults schlafli(const std::vector<int> &symbol) {
Mults mults{}; Mults mults{};
for (int i = 0; i < symbol.size(); ++i) { for (int i = 0; i < symbol.size(); ++i) {

View File

@@ -39,14 +39,11 @@ glm::vec4 center(const Mults &mults) {
} }
std::vector<glm::vec4> std::vector<glm::vec4>
vertices(const Mults &mults, const glm::vec4 ident) { vertices(const Table *t_vert, const glm::vec4 ident) {
int N = mults.num_gens; const std::vector<glm::vec4> normals = mirror(t_vert->mults);
Table *table = solve(all_gens(N), {}, mults);
const std::vector<glm::vec4> normals = mirror(mults);
std::vector<glm::vec4> verts{}; std::vector<glm::vec4> verts{};
for (const auto &word : table->words()) { for (const auto &word : t_vert->words()) {
glm::vec4 vert = ident; glm::vec4 vert = ident;
for (const auto &gen : word) { for (const auto &gen : word) {
vert = reflect(vert, normals[gen]); vert = reflect(vert, normals[gen]);
@@ -57,16 +54,14 @@ vertices(const Mults &mults, const glm::vec4 ident) {
return verts; return verts;
} }
std::vector<int> edges(const Mults &mults) { std::vector<int> edges(const Table *t_vert) {
std::vector<int> res{}; std::vector<int> res{};
Mults mults = t_vert->mults;
int N = mults.num_gens; int N = mults.num_gens;
const std::vector<int> &gens = all_gens(N); const std::vector<int> &gens = t_vert->gens;
Table *t_vert = solve(gens, {}, mults);
for (const auto &subgens : combinations(N, 1)) { for (const auto &subgens : combinations(N, 1)) {
if (subgens[0] == 0) continue;
Table *t_edge = solve(subgens, {}, mults); Table *t_edge = solve(subgens, {}, mults);
std::vector<int> edge = t_vert->apply_each(t_edge->words()); std::vector<int> edge = t_vert->apply_each(t_edge->words());
@@ -83,23 +78,14 @@ std::vector<int> edges(const Mults &mults) {
return res; return res;
} }
std::vector<int> faces(const Mults &mults) { std::vector<int> faces(const Table *t_vert) {
std::vector<int> res{}; std::vector<int> res{};
const Mults &mults = t_vert->mults;
int N = mults.num_gens; int N = mults.num_gens;
const std::vector<int> &gens = all_gens(N); const std::vector<int> &gens = t_vert->gens;
Table *t_vert = solve(gens, {}, mults);
// for each *kind* of face // for each *kind* of face
for (const auto &sg_face : combinations(N, 2)) { for (const auto &sg_face : combinations(N, 2)) {
if (sg_face[0] == 0 and sg_face[1] == 3) continue; // checker
if (sg_face[0] == 0 and sg_face[1] == 2) continue; // checker
// if (sg_face[0] == 1 and sg_face[1] == 2) continue; // checker
// if (sg_face[0] == 1 and sg_face[1] == 3) continue; // checker
if (sg_face[0] == 0 and sg_face[1] == 1) continue; // flat
// if (sg_face[0] == 2 and sg_face[1] == 3) continue; // vertical
Table *cs_face = solve(gens, sg_face, mults); Table *cs_face = solve(gens, sg_face, mults);
// for each *kind* of edge // for each *kind* of edge