Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <vector>
- #include <array>
- using namespace std;
- template <typename T, size_t M>
- class Polygon
- {
- public:
- double perimeter();
- void add_vertex(const array<T, M> &point);
- double min_square();
- double min_surround_area();
- private:
- vector<array<T, M>> coordinates_;
- };
- template <typename T, size_t M>
- void Polygon<T, M>::add_vertex(const array<T, M> &point)
- {
- coordinates_.push_back(point);
- }
- template <typename T, size_t M>
- double Polygon<T, M>::perimeter()
- {
- double p = 0; //хранение результата
- double len; //длина текущего отрезка
- double sum; //текущая координата
- //a_len = sqrt((x ^ 2) + (y ^ 2))
- for (size_t i = 0; i < coordinates_.back() - 1; i++) //по точкам
- {
- sum = 0;
- for (size_t j = 0; j < M; j++) //по координатам
- sum += (abs(coordinates_[i][j] - coordinates_[i + 1][j]))
- * (abs(coordinates_[i][j] - coordinates_[i + 1][j]));
- len = sqrt(sum);
- p += len;
- }
- for (size_t j = 0; j < M; j++)
- sum += (abs(coordinates_[0][j] - coordinates_[coordinates_.back()][j]))
- * (abs(coordinates_[0][j] - coordinates_[coordinates_.back()][j]));
- len = sqrt(sum);
- p += len;
- return p;
- }
- template <typename T, size_t M>
- double Polygon<T, M>::min_square()
- {
- double s = 0;
- T min_x, min_y, max_x, max_y;
- min_x = coordinates_[0][0];
- max_x = coordinates_[0][0];
- min_y = coordinates_[0][1];
- max_y = coordinates_[0][1];
- for (size_t i = 0; i < coordinates_.back() - 1; i++) //по точкам
- {
- if (coordinates_[i][0] > max_x) max_x = coordinates_[i][0];
- if (coordinates_[i][0] < min_x) min_x = coordinates_[i][0];
- if (coordinates_[i][1] > max_y) max_y = coordinates_[i][1];
- if (coordinates_[i][1] > min_y) min_y = coordinates_[i][1];
- }
- s = (max_x - min_x) * (max_y - min_y);
- return s;
- }
- template<typename T, size_t M>
- double Polygon<T, M>::min_surround_area()
- {
- static_assert(M == 2, "Реализовано только для случая M = 2");
- double s = min_square();
- return s;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement