Added labels to polygons to make it clear what is getting printed
This commit is contained in:
parent
33cbe4a683
commit
3c2335235e
@ -8,7 +8,8 @@ static double to_rad(double angle_in_deg) {
|
|||||||
return angle_in_deg * PI_180;
|
return angle_in_deg * PI_180;
|
||||||
}
|
}
|
||||||
|
|
||||||
polygon poly_generate::rectangle(double width, double height, double mass) {
|
polygon poly_generate::rectangle(
|
||||||
|
double width, double height, double mass, std::string label) {
|
||||||
assert(width > 0);
|
assert(width > 0);
|
||||||
assert(height > 0);
|
assert(height > 0);
|
||||||
static const double one_over_twelve = 1. / 12;
|
static const double one_over_twelve = 1. / 12;
|
||||||
@ -19,11 +20,12 @@ polygon poly_generate::rectangle(double width, double height, double mass) {
|
|||||||
{width / 2, height / 2},
|
{width / 2, height / 2},
|
||||||
{width / 2, -height / 2}},
|
{width / 2, -height / 2}},
|
||||||
one_over_twelve * mass * (width * width + height * height),
|
one_over_twelve * mass * (width * width + height * height),
|
||||||
mass};
|
mass,
|
||||||
|
label};
|
||||||
}
|
}
|
||||||
|
|
||||||
polygon poly_generate::triangle(
|
polygon poly_generate::triangle(
|
||||||
double side1, double side2, double angle, double mass) {
|
double side1, double side2, double angle, double mass, std::string label) {
|
||||||
assert(side1 > 0);
|
assert(side1 > 0);
|
||||||
assert(side2 > 0);
|
assert(side2 > 0);
|
||||||
static const double one_over_36 = 1. / 36;
|
static const double one_over_36 = 1. / 36;
|
||||||
@ -44,12 +46,16 @@ polygon poly_generate::triangle(
|
|||||||
0,
|
0,
|
||||||
{std::begin(points), std::end(points)},
|
{std::begin(points), std::end(points)},
|
||||||
one_over_36 * mass * base * std::pow(height, 3),
|
one_over_36 * mass * base * std::pow(height, 3),
|
||||||
mass};
|
mass,
|
||||||
|
label};
|
||||||
}
|
}
|
||||||
|
|
||||||
polygon poly_generate::regular(double radius, uint n_sides, double mass) {
|
polygon poly_generate::regular(
|
||||||
|
double radius, uint n_sides, double mass, std::string label) {
|
||||||
assert(n_sides > 2);
|
assert(n_sides > 2);
|
||||||
std::vector<vec2d> points;
|
std::vector<vec2d> points;
|
||||||
|
label += " ";
|
||||||
|
label += n_sides;
|
||||||
points.reserve(n_sides);
|
points.reserve(n_sides);
|
||||||
double theta = 2 * M_PI / n_sides;
|
double theta = 2 * M_PI / n_sides;
|
||||||
|
|
||||||
@ -63,7 +69,7 @@ polygon poly_generate::regular(double radius, uint n_sides, double mass) {
|
|||||||
double cot = cos_ / sin_;
|
double cot = cos_ / sin_;
|
||||||
|
|
||||||
double inertia = mass * l * l / 24 * (1 + 3 * cot * cot);
|
double inertia = mass * l * l / 24 * (1 + 3 * cot * cot);
|
||||||
return polygon{{0, 0}, 0, points, inertia, mass};
|
return polygon{{0, 0}, 0, points, inertia, mass, label};
|
||||||
}
|
}
|
||||||
|
|
||||||
static double area_of_triangle(vec2d& a, vec2d& b, vec2d& c) {
|
static double area_of_triangle(vec2d& a, vec2d& b, vec2d& c) {
|
||||||
@ -84,7 +90,6 @@ static double intertia_of_polygon_subtriangle(double total_mass,
|
|||||||
vec2d& p1,
|
vec2d& p1,
|
||||||
vec2d& p2) {
|
vec2d& p2) {
|
||||||
double partial_area = area_of_triangle(centroid, p1, p2);
|
double partial_area = area_of_triangle(centroid, p1, p2);
|
||||||
std::cout << "partial area: " << partial_area << std::endl;
|
|
||||||
double partial_mass = total_mass * partial_area / total_area;
|
double partial_mass = total_mass * partial_area / total_area;
|
||||||
|
|
||||||
vec2d CA = p1 - centroid;
|
vec2d CA = p1 - centroid;
|
||||||
@ -102,13 +107,12 @@ static vec2d centroid(std::vector<vec2d>& points) {
|
|||||||
return vec2d{x, y} / points.size();
|
return vec2d{x, y} / points.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
polygon poly_generate::general(std::vector<vec2d> points, double mass) {
|
polygon poly_generate::general(
|
||||||
|
std::vector<vec2d> points, double mass, std::string label) {
|
||||||
double intertia = 0;
|
double intertia = 0;
|
||||||
vec2d c = centroid(points);
|
vec2d c = centroid(points);
|
||||||
double area = area_of_poly(points, c);
|
double area = area_of_poly(points, c);
|
||||||
std::cout << "area: " << area << std::endl;
|
|
||||||
|
|
||||||
std::cout << "centroid: " << c << std::endl;
|
|
||||||
for (int i = 0; i < points.size(); ++i)
|
for (int i = 0; i < points.size(); ++i)
|
||||||
intertia += intertia_of_polygon_subtriangle(
|
intertia += intertia_of_polygon_subtriangle(
|
||||||
mass, area, c, points[i], points[(i + 1) % points.size()]);
|
mass, area, c, points[i], points[(i + 1) % points.size()]);
|
||||||
@ -116,5 +120,5 @@ polygon poly_generate::general(std::vector<vec2d> points, double mass) {
|
|||||||
for (auto& p : points) // set the center of the polygon to it's centroid
|
for (auto& p : points) // set the center of the polygon to it's centroid
|
||||||
p -= c;
|
p -= c;
|
||||||
|
|
||||||
return polygon{{0, 0}, 0, points, intertia, mass};
|
return polygon{{0, 0}, 0, points, intertia, mass, label};
|
||||||
}
|
}
|
||||||
|
@ -7,18 +7,31 @@
|
|||||||
|
|
||||||
namespace poly_generate {
|
namespace poly_generate {
|
||||||
|
|
||||||
polygon rectangle(double width, double height, double mass = 1);
|
polygon rectangle(double width,
|
||||||
|
double height,
|
||||||
|
double mass = 1,
|
||||||
|
std::string label = "rectangle");
|
||||||
|
|
||||||
inline polygon square(double width, double mass = 1) {
|
inline polygon square(
|
||||||
|
double width, double mass = 1, std::string label = "square") {
|
||||||
assert(width > 0);
|
assert(width > 0);
|
||||||
return rectangle(width, width, mass);
|
return rectangle(width, width, mass, label);
|
||||||
};
|
};
|
||||||
|
|
||||||
polygon triangle(double side1, double side2, double angle, double mass = 1);
|
polygon triangle(double side1,
|
||||||
|
double side2,
|
||||||
|
double angle,
|
||||||
|
double mass = 1,
|
||||||
|
std::string label = "triangle");
|
||||||
|
|
||||||
polygon regular(double radius, uint n_sides, double mass = 1);
|
polygon regular(double radius,
|
||||||
|
uint n_sides,
|
||||||
|
double mass = 1,
|
||||||
|
std::string label = "regular");
|
||||||
|
|
||||||
polygon general(std::vector<vec2d> points, double mass = 1);
|
polygon general(std::vector<vec2d> points,
|
||||||
|
double mass = 1,
|
||||||
|
std::string label = "general");
|
||||||
|
|
||||||
}; // namespace poly_generate
|
}; // namespace poly_generate
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user