fix numerical issues in stability calculations
This commit is contained in:
parent
90e77f9135
commit
9cfde724f1
1 changed files with 10 additions and 1 deletions
|
@ -638,12 +638,14 @@ public:
|
|||
|
||||
auto compute_elastic_section_modulus = [&line_dir](
|
||||
const Vec3f ¢roid_accumulator, const Vec2f &second_moment_of_area_accumulator, const float &area) {
|
||||
if (area < EPSILON) return 0.0f;
|
||||
Vec3f centroid = centroid_accumulator / area;
|
||||
Vec2f variance = (second_moment_of_area_accumulator / area
|
||||
- centroid.head<2>().cwiseProduct(centroid.head<2>()));
|
||||
variance = variance.cwiseProduct(line_dir.cwiseAbs());
|
||||
float extreme_fiber_dist = variance.cwiseSqrt().norm();
|
||||
if (extreme_fiber_dist < EPSILON) {
|
||||
return 0.0f;
|
||||
}
|
||||
float elastic_section_modulus = area * (variance.x() + variance.y()) / extreme_fiber_dist;
|
||||
return elastic_section_modulus;
|
||||
};
|
||||
|
@ -663,6 +665,9 @@ public:
|
|||
|
||||
// section for bed calculations
|
||||
{
|
||||
if (this->sticking_area < EPSILON)
|
||||
return 1.0f;
|
||||
|
||||
Vec3f bed_centroid = this->sticking_centroid_accumulator / this->sticking_area;
|
||||
float bed_yield_torque = compute_elastic_section_modulus(this->sticking_centroid_accumulator,
|
||||
this->sticking_second_moment_of_area_accumulator, this->sticking_area)
|
||||
|
@ -708,6 +713,9 @@ public:
|
|||
|
||||
//section for weak connection calculations
|
||||
{
|
||||
if (connection.area < EPSILON)
|
||||
return 1.0f;
|
||||
|
||||
Vec3f conn_centroid = connection.centroid_accumulator / connection.area;
|
||||
float conn_yield_torque = compute_elastic_section_modulus(connection.centroid_accumulator,
|
||||
connection.second_moment_of_area_accumulator, connection.area) * params.material_yield_strength;
|
||||
|
@ -763,6 +771,7 @@ void debug_print_graph(const std::vector<LayerIslands> &islands_graph) {
|
|||
std::cout << " volume: " << island.volume << std::endl;
|
||||
std::cout << " sticking_area: " << island.sticking_area << std::endl;
|
||||
std::cout << " connected_islands count: " << island.connected_islands.size() << std::endl;
|
||||
std::cout << " lines count: " << island.external_lines.size() << std::endl;
|
||||
}
|
||||
}
|
||||
std::cout << "END OF GRAPH" << std::endl;
|
||||
|
|
Loading…
Reference in a new issue