651{
652 Vec3f best_direction{ 0, 0, 0 };
653 Vec3f machine_cool_dir{ 0, 0, 0 };
654
656 {
657
658 return;
659 }
661 {
662 machine_cool_dir = { 1, 0, 0 };
663 }
664 else
665 {
666
667 machine_cool_dir = { -1, 0, 0 };
668 }
669
670
673
674 Eigen::VectorXf normal_projection(nfaces, 1);
675 for (auto i = 0; i < nfaces; i++)
676 {
677 normal_projection(i) = face_normals[i].dot(
Vec3f(0, 0, 1));
678 }
679 float angle_thres_high = -0.6427f;
680 float angle_thres_low = -0.97f;
681
682 Eigen::VectorXf weighted_areas = Eigen::VectorXf::Zero(nfaces);
683 for (int i = 0; i < nfaces; i++)
684 {
685 if (normal_projection(i) < angle_thres_high && normal_projection(i) > angle_thres_low)
686 {
687 weighted_areas(i) = mesh.
its.facet_area(i) * (1.0f - normal_projection(i));
688 }
689 }
690
691 const size_t sample_nums = 180;
692 std::vector<Vec3f> cool_dirs;
693 for (size_t i = 0; i < sample_nums; i++)
694 {
695 float angle_deg = i * (360.0 / sample_nums);
696 float angle_rad = angle_deg * (
PI / 180.0);
697 cool_dirs.push_back(
Vec3f{ std::cos(angle_rad), std::sin(angle_rad), 0 });
698 }
699
700
701 float overhang_projected_max = 0.f;
702 float overhang_projected_origin = 0.f;
703 for (auto cool_dir : cool_dirs)
704 {
705 float overhang_projected_tmp = 0.f;
706 for (size_t i = 0; i < nfaces; i++)
707 {
708 float cool_dir_projection = face_normals[i].dot(cool_dir);
709 if (weighted_areas[i] > 0 && cool_dir_projection > 0)
710 {
711 overhang_projected_tmp += weighted_areas[i] * cool_dir_projection;
712 }
713 }
714 if (overhang_projected_tmp > overhang_projected_max)
715 {
716 overhang_projected_max = overhang_projected_tmp;
717 best_direction = cool_dir;
718 }
719 if (cool_dir.dot(machine_cool_dir) > 0.999)
720 {
721 overhang_projected_origin = overhang_projected_tmp;
722 }
723 }
724
725
726 if (std::abs(overhang_projected_origin - overhang_projected_max) < 1.0f)
727 {
728 return;
729 }
730
731
737}
indexed_triangle_set its
Definition TriangleMesh.hpp:164
void rotate(float angle, const Axis &axis)
Definition TriangleMesh.cpp:302
size_t facets_count() const
Definition TriangleMesh.hpp:145
static constexpr double PI
Definition libslic3r.h:81
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:65
std::vector< Vec3f > its_face_normals(const indexed_triangle_set &its)
Definition TriangleMesh.cpp:1625
@ fdUndefine
Definition PrintConfig.hpp:532
@ fdRight
Definition PrintConfig.hpp:534