C/C++

Расчет площади по двумерным точкам С++

Мне нужно разработать программу, которая вычислит площадь фигуры по точкам. То есть у меня дана координатная ось, на ней расположена сложная фигура (фото снизу). Как я поняла нужно сгенерировать двумерные точки, проверить попадает ли точка в нужную мне область и дальше делать по данной мне формуле вычисления. Только как на практике проверить попадает ли точка в заданную область в квадрате
Вот вам подобная задача для вычисления площади круга, радиусом 12.5, методом Монте-Карло.

#include <iostream>
#include <random>
#include <vector>
#include <iomanip>
using namespace std;
class Random {
public:
Random() {
random_device device;
random_generator_64_.seed(device());
}
double next(double first, double last) {
uniform_real_distribution<double> range(first, last);
return range(random_generator_64_);
}
private:
mt19937_64 random_generator_64_;
};
struct Point {
double x;
double y;
Point() : x(0), y(0) {}
Point(double x, double y) : x(x), y(y) {}
double radius()const {
return sqrt(x * x + y * y);
}
};
class Plane {
public:
Plane() = default;
Plane(size_t n) { box_.resize(n); }
void generate(double left, double right) {
Random rand;
for (auto& point : box_) {
point = Point(rand.next(left, right), rand.next(left, right));
}
}
vector<Point> get()const {
return box_;
}
private:
vector<Point> box_;
};
class Circle {
public:
Circle() : center_({0, 0}), radius_(0) {}
Circle(Point& center, double radius) : center_(center), radius_(radius) {}
bool includes(const Point& p)const {
Point mp = { p.x - center_.x, p.y - center_.y };
return mp.radius() <= radius_;
}
private:
Point center_;
double radius_;
};
unsigned count(Circle& circle, vector<Point>& box) {
auto n = 0U;
for (const auto& point : box) {
if (circle.includes(point)) ++n;
}
return n;
}
int main() {
constexpr auto c = 0U;
constexpr auto xy = 40U;
constexpr auto s = xy * xy;
constexpr auto n = s * 1000U;
Plane plane(n);
plane.generate(c, xy);
auto box = plane.get();
Point center(23, 27);
double radius = 12.5;
Circle circle(center, radius);
auto points = count(circle, box);
auto area = double(points) / box.size() * s;
cout << fixed << setprecision(3);
cout << "Monte Carlo method: " << area << '\n';
constexpr auto pi = 3.1415926535897932;
auto prec = pi * pow(radius, 2);
cout << "Area circle: " << prec << '\n';
auto se = prec - area;
cout << "Statistical error: " << se << '\n';
system("pause > nul");
}
Дмитрий Shegai
Дмитрий Shegai
77 360
Лучший ответ
Область "розыгрыша": квадрат (-1, -1), (-1, 1), (1, 1), (1, -1)

Попадание точки в заштрихованную область:
y >= 0? 2 * y <= x + 1 : x < 0? x * x + y * y <= 1 : max(x, -y) <= 1
Михаил Хомяков
Михаил Хомяков
65 984
Алишер Жумабеков извините за наглость, но как код будет выглядеть? Какие операторы вы используете?
Метод подсчета площади генерируя случайные точки называется "метод Монте-Карло"
В интернете готовых решений ну слишком много
https://www.google.com/search?ei=ymh_X6O8J_SGwPAP3NWxsAM&q=С+++площадь+Монте-Карло&oq=С+++площадь+Монте-Карло&gs_lcp=CgZwc3ktYWIQA1CPgwJY5LECYN23AmgAcAF4AIABAIgBAJIBAJgBAKABAaABAqoBB2d3cy13aXo&sclient=psy-ab&ved=0ahUKEwijyfjl3aXsAhV0AxAIHdxqDDYQ4dUDCA0&uact=5
Oleg Pojarkov
Oleg Pojarkov
12 592