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 {
const std::vector<int> gens;
const Mults mults;
std::vector<int> gen_inds;
std::vector<std::vector<int>> fwd;
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;
@@ -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> &subgens, const Mults &mults);
Table *solve_elems(const Mults &mults);
Mults schlafli(const std::vector<int> &symbol);
std::vector<int> all_gens(int N);

View File

@@ -52,25 +52,34 @@ public:
u_view = glGetUniformLocation(program, "view");
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 = identity(mults, {10, 1, 1, 1});
const glm::vec4 ident = identity(mults, {1,});
std::cout << "Dimension: " << mults.num_gens << std::endl;
std::cout << "Generation times: " << std::endl;
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();
std::chrono::duration<double> vert_time = gen_vert - gen_start;
std::chrono::duration<double> vert_time = gen_vert - gen_solve;
std::cout
<< "Vertices: "
<< std::setw(5) << std::setprecision(3) << vert_time.count()
<< " (" << vert_data.size() << ")"
<< std::endl;
edge_data = edges(mults);
edge_data = edges(t_vert);
auto gen_edge = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> edge_time = gen_edge - gen_vert;
std::cout
@@ -79,7 +88,7 @@ public:
<< " (" << edge_data.size() / 2 << ")"
<< std::endl;
face_data = faces(mults);
face_data = faces(t_vert);
auto gen_face = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> face_time = gen_face - gen_edge;
std::cout
@@ -147,8 +156,20 @@ public:
const float sc = 1.5f;
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 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);
glUniformMatrix4fv(u_proj, 1, false, glm::value_ptr(proj));
@@ -166,16 +187,20 @@ public:
glBindVertexArray(vert_vao);
glUniform4f(u_color, 1, 0, 0, 1);
// glDrawArrays(GL_POINTS, 0, vert_data.size());
glDrawArrays(GL_POINTS, 0, vert_data.size());
glBindVertexArray(edge_vao);
glUniform4f(u_color, 1, 0, 0, 1);
glDrawElements(GL_LINES, edge_data.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(face_vao);
glCullFace(GL_FRONT);
glCullFace(GL_NONE);
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();
}

View File

@@ -53,7 +53,7 @@ std::vector<std::vector<int>> Mults::irelations(Table *table, std::vector<int> g
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();
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) {
auto *table = new Table(gens);
auto *table = new Table(gens, mults);
const auto irels = mults.irelations(table, gens);
for (int gen : subgens)
@@ -260,6 +260,14 @@ Table *solve(const std::vector<int> &gens, const std::vector<int> &subgens, cons
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 mults{};
for (int i = 0; i < symbol.size(); ++i) {

View File

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