Разработать программу выбора из заданного на плоскости множества точек N
(N вводится) трех точек, не лежащих на одной прямой, составляющих
треугольник наименьшей площади. Координаты точек формируются
программой случайным образом.
C/C++
Помогите с задачей на C++
тип координат целые или с десятичной точкой?
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <random>
using namespace std;
struct Point {
double x;
double y;
Point() : x(0), y(0) {}
Point(const double x, const double y) : x(x), y(y) {}
double length(const Point& p)const {
return sqrt(pow(p.x - x, 2) + pow(p.y - y, 2));
}
private:
friend ostream& operator<<(ostream& out, const Point& p) {
return out << "{ " << p.x << ", " << p.y << " }";
}
};
class Triangle {
public:
Triangle(const Point& a, const Point& b, const Point& c) : a(a), b(b), c(c) {}
double perimeter()const {
return a.length(b) + b.length(c) + c.length(a);
}
bool exist()const {
return argument() > 0.0;
}
double area()const {
return sqrt(argument());
}
void coords()const {
cout << *this << '\n';
}
private:
Point a;
Point b;
Point c;
double argument()const {
auto p = perimeter() / 2.0;
auto ab = a.length(b);
auto bc = b.length(c);
auto ca = c.length(a);
return p * (p - ab) * (p - bc) * (p - ca);
}
friend bool operator<(const Triangle& a, const Triangle& b) {
return a.area() < b.area();
}
friend bool operator==(const Triangle& a, const Triangle& b) {
return fabs(a.area() - b.area()) < 1e-14;
}
friend ostream& operator<<(ostream& out, const Triangle& p) {
return out << "{" << p.a << ", " << p.b << ", " << p.c << "}; area: " << p.area();
}
};
class Plane {
public:
explicit Plane(const size_t quantity) : quantity(quantity) {
points.resize(quantity);
}
void random_fill() {
uniform_int_distribution<> uid(-999, 999);
mt19937 gen{ random_device()() };
for (auto& point : points) point = { uid(gen) / 100.0, uid(gen) / 100.0 };
}
void show_points()const {
for (const auto& point : points) cout << point << '\n';
}
vector<Triangle> triangles()const {
vector<Triangle> box;
if (points.size() > 2U) {
auto iend = points.size() - 2;
auto jend = points.size() - 1;
auto kend = points.size();
for (auto i = 0U; i < iend; ++i) {
for (auto j = 1U; j < jend; ++j) {
for (auto k = 2U; k < kend; ++k) {
Triangle tr{ points[i], points[j], points[k] };
if (tr.exist()) {
if (!count(box.begin(), box.end(), tr)) box.push_back(tr);
}
}
}
}
sort(box.begin(), box.end());
}
return box;
}
private:
size_t quantity;
vector<Point> points;
};
int main() {
cout << "N: ";
size_t n;
cin >> n;
Plane plane(n);
plane.random_fill();
cout.setf(ios::fixed);
cout.precision(2U);
puts("Points:");
plane.show_points();
auto triangles = plane.triangles();
puts("Triangles:");
for (const auto& triangle : triangles) cout << triangle << '\n';
auto min = triangles.at(0);
puts("Min:");
min.coords();
system("pause > nul");
}
#include <iostream>
#include <cmath>
#include <vector>
#include <random>
using namespace std;
struct Point {
double x;
double y;
Point() : x(0), y(0) {}
Point(const double x, const double y) : x(x), y(y) {}
double length(const Point& p)const {
return sqrt(pow(p.x - x, 2) + pow(p.y - y, 2));
}
private:
friend ostream& operator<<(ostream& out, const Point& p) {
return out << "{ " << p.x << ", " << p.y << " }";
}
};
class Triangle {
public:
Triangle(const Point& a, const Point& b, const Point& c) : a(a), b(b), c(c) {}
double perimeter()const {
return a.length(b) + b.length(c) + c.length(a);
}
bool exist()const {
return argument() > 0.0;
}
double area()const {
return sqrt(argument());
}
void coords()const {
cout << *this << '\n';
}
private:
Point a;
Point b;
Point c;
double argument()const {
auto p = perimeter() / 2.0;
auto ab = a.length(b);
auto bc = b.length(c);
auto ca = c.length(a);
return p * (p - ab) * (p - bc) * (p - ca);
}
friend bool operator<(const Triangle& a, const Triangle& b) {
return a.area() < b.area();
}
friend bool operator==(const Triangle& a, const Triangle& b) {
return fabs(a.area() - b.area()) < 1e-14;
}
friend ostream& operator<<(ostream& out, const Triangle& p) {
return out << "{" << p.a << ", " << p.b << ", " << p.c << "}; area: " << p.area();
}
};
class Plane {
public:
explicit Plane(const size_t quantity) : quantity(quantity) {
points.resize(quantity);
}
void random_fill() {
uniform_int_distribution<> uid(-999, 999);
mt19937 gen{ random_device()() };
for (auto& point : points) point = { uid(gen) / 100.0, uid(gen) / 100.0 };
}
void show_points()const {
for (const auto& point : points) cout << point << '\n';
}
vector<Triangle> triangles()const {
vector<Triangle> box;
if (points.size() > 2U) {
auto iend = points.size() - 2;
auto jend = points.size() - 1;
auto kend = points.size();
for (auto i = 0U; i < iend; ++i) {
for (auto j = 1U; j < jend; ++j) {
for (auto k = 2U; k < kend; ++k) {
Triangle tr{ points[i], points[j], points[k] };
if (tr.exist()) {
if (!count(box.begin(), box.end(), tr)) box.push_back(tr);
}
}
}
}
sort(box.begin(), box.end());
}
return box;
}
private:
size_t quantity;
vector<Point> points;
};
int main() {
cout << "N: ";
size_t n;
cin >> n;
Plane plane(n);
plane.random_fill();
cout.setf(ios::fixed);
cout.precision(2U);
puts("Points:");
plane.show_points();
auto triangles = plane.triangles();
puts("Triangles:");
for (const auto& triangle : triangles) cout << triangle << '\n';
auto min = triangles.at(0);
puts("Min:");
min.coords();
system("pause > nul");
}
Похожие вопросы
- ПОМОГИТЕ С ЗАДАЧЕЙ НА C++
- Помогите решить задачу по C++!
- Помогите решить задачу на C++.
- Помогите с задачей по C++
- Помогите решить задачу на C++
- Помогите решить задачу на c++
- Помогите решить задачу на C++
- Помогите с задачей по C++
- Помогите с задачей в C++ пожалуйста. Какое условие правильно написать в Z чтобы выводилось сообщение "error!" ?
- Помогите решить задачу на C++
https://pastebin.com/sFj4NzT2
проверяй сам возможны ошибки