diff --git a/src/geometrytest.cpp b/src/geometrytest.cpp index c1e49ec..674dc11 100644 --- a/src/geometrytest.cpp +++ b/src/geometrytest.cpp @@ -9,53 +9,62 @@ #include #include -int main() { - std::vector symbol = {5, 3, 3}; - vec4 root{0.80, 0.02, 0.02, 0.02}; +template +using ProjectiveNf = Eigen::Transform; +template +using VectorNf = Eigen::Vector; - auto group = tc::schlafli(symbol); - auto gens = generators(group); - auto combos = combinations(gens, 2); - - const auto &inds = merge<3>(hull<3>(group, combos, { - {0, 1}, - })); - - auto cosets = group.solve(); - auto mirrors = mirror<4>(group); +template +Eigen::Matrix make_points( + const tc::Group &group, + const Eigen::Vector &root +) { + auto mirrors = mirror(group); auto corners = plane_intersections(mirrors); auto start = barycentric(corners, root); - using Projective = Eigen::Transform; - Projective transform = Projective::Identity(); + auto cosets = group.solve(); - auto higher = cosets.path.walk(start, mirrors, reflect); - std::transform( - higher.begin(), higher.end(), higher.begin(), - [&](const vec4 &v) { - return (transform * v.homogeneous()).hnormalized(); - } - ); + auto verts = cosets.path.walk, VectorNf>(start, mirrors, reflect); -// std::vector lower(higher.size()); -// std::transform(higher.begin(), higher.end(), lower.begin(), stereo<4>); -// const auto &verts = lower; - - const auto &verts = higher; - - using PT = Eigen::Matrix; - using CT = Eigen::Matrix; - - PT points(4, verts.size()); + Eigen::Matrix points(root.size(), verts.size()); std::copy(verts.begin(), verts.end(), points.colwise().begin()); - CT cells = inds; + return points; +} + +template +Eigen::Matrix make_cells( + const tc::Group &group, + const std::vector> &exclude = {} +) { + auto gens = generators(group); + auto combos = combinations(gens, N - 1); + + Eigen::Matrix cells = merge(hull(group, combos, exclude)); + + return cells; +} + +int main() { + std::vector symbol = {5, 3, 3}; + auto group = tc::schlafli(symbol); + + vec4 root{0.80, 0.02, 0.02, 0.02}; + + auto points = make_points(group, root); + auto cells = make_cells<3>(group, {{0, 1}}); + + ml::Mesh mesh(points, cells); + +// auto transform = ProjectiveNf::Identity(); +// transform.translation() << 0, 0.5, 0, 0; +// points = (transform * points.colwise().homogeneous()).colwise().hnormalized(); std::cout << points.rows() << " " << points.cols() << std::endl; std::cout << cells.rows() << " " << cells.cols() << std::endl; - ml::Mesh mesh(points, cells); ml::write(mesh, std::ofstream("dodeca.pak", std::ios::out | std::ios::binary)); return EXIT_SUCCESS;