Advertisement
Guest User

vec 2 bun

a guest
Oct 17th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "utils.h"
  4.  
  5. struct Vector2D {
  6.     union {
  7.         struct {
  8.             double x, y;
  9.         };
  10.         double data[2];
  11.     };
  12.  
  13.     constexpr double* begin() { return data; }
  14.     constexpr const double* begin() const { return data; }
  15.  
  16.  
  17.     constexpr double* end() { return data + 2; }
  18.     constexpr const double* end() const { return data + 2; }
  19.  
  20.     constexpr Vector2D() : x(0), y(0) {}
  21.  
  22.     constexpr Vector2D(double x, double y) : x(x), y(y) {}
  23.  
  24.  
  25.     constexpr size_t size() const { return 2; }
  26.  
  27.     constexpr double& operator[](size_t i) { return data[i]; }
  28.     constexpr double operator[](size_t i) const { return data[i]; }
  29.  
  30.     friend std::ostream& operator<<(std::ostream& s, const Vector2D& v) {
  31.         return s << "(" << v.x << ", " << v.y << ")";
  32.     }
  33.     static auto read() {
  34.         Vector2D res;
  35.         for (auto& v : res) std::cin >> v;
  36.         return res;
  37.     }
  38.  
  39.     double norm() const;
  40.     double norm2() const;
  41.  
  42.     Vector2D operator+(Vector2D rhs) const {
  43.         return Vector2D(rhs.x + x, rhs.y + y);
  44.     }
  45.     Vector2D& operator+=(Vector2D rhs) {
  46.         x += rhs.x;
  47.         y += rhs.y;
  48.         return *this;
  49.     }
  50.     Vector2D operator-() const {
  51.         return Vector2D(-x, -y);
  52.     }
  53.     Vector2D operator-(Vector2D rhs) const {
  54.         return Vector2D(rhs.x - x, rhs.y - y);
  55.     }
  56.     Vector2D operator*(double rhs) const {
  57.         return Vector2D(rhs * x, rhs * y);
  58.     }
  59.     friend Vector2D operator*(double lhs, Vector2D rhs) {
  60.         return Vector2D(rhs.x*lhs, rhs.y * lhs);
  61.     }
  62. };
  63.  
  64. double dot(const Vector2D& a, const Vector2D& b) {
  65.     double res = 0;
  66.     auto bIt = b.begin();
  67.     for (auto& v : a) res += v * (*(bIt++));
  68.     return res;
  69. }
  70. double norm2(const Vector2D& a) {
  71.     return dot(a, a);
  72. }
  73. double norm(const Vector2D& a) {
  74.     return std::sqrt(dot(a, a));
  75. }
  76. double Vector2D::norm() const {
  77.     return ::norm(*this);
  78. }
  79. double Vector2D::norm2() const {
  80.     return ::norm2(*this);
  81. }
  82. double distance(Vector2D a, Vector2D b) {
  83.     return norm(a - b);
  84. }
  85. double det(Vector2D a, Vector2D b, Vector2D c) {
  86.     return a.x * b.y + b.x * c.y + a.y *c.x -
  87.         c.x * b.y - c.y * a.x - a.y * b.x;
  88. }
  89. bool coliniar(Vector2D a, Vector2D b, Vector2D c) {
  90.     return det(a, b,c) < eps;
  91. }
  92.  
  93. struct Cerc {
  94.     double r;
  95.     Vector2D center;
  96. };
  97. Cerc cerc(Vector2D a, Vector2D b, Vector2D c) {
  98.     double area = std::abs(det(a, b, c));
  99.     if (area< eps) throw std::logic_error("Points are coliniar");
  100.     double l1 = distance(a, b);
  101.     double l2 = distance(a, c);
  102.     double l3 = distance(c, b);
  103.     Vector2D o{
  104.         norm(a) * (b.y - c.y) + norm(b) * ( norm(c),
  105.         0
  106.     };
  107.  
  108.     return Cerc((l1*l2*l3) / (4 * area), o);
  109. }
  110.  
  111. void test() {
  112.     try {
  113.         int n = readSize("n");
  114.         Vector2D *v = new Vector2D[n];
  115.         v[0] = Vector2D::read();
  116.  
  117.         Vector2D max = v[0];
  118.         double maxNorm = max.norm2();
  119.         Vector2D min = v[0];
  120.         double minNorm = maxNorm;
  121.  
  122.         Vector2D sum = v[0];
  123.  
  124.         for (int i = 1; i < n; ++i) {
  125.             v[i] = Vector2D::read();
  126.             auto& vec = v[i];
  127.             sum += vec;
  128.             auto norm = vec.norm2();
  129.             if (norm > maxNorm) {
  130.                 maxNorm = norm;
  131.                 max = vec;
  132.             }
  133.             else if (norm < minNorm) {
  134.                 minNorm = norm;
  135.                 min = vec;
  136.             }
  137.         }
  138.         std::cout << "max:" << max << ";" << max.norm() << "\n";
  139.         std::cout << "min:" << min << ";" << min.norm() << "\n";
  140.  
  141.         std::cout << "sum" << sum << "\n";
  142.  
  143.  
  144.  
  145.         /*
  146.         Vector2D a = Vector2D::read();// { 3, 4, };
  147.  
  148.         Vector2D b = Vector2D::read();// { 3, 4, };
  149.         //  Vector2D b{ 2, 3,};
  150.         std::cout << "a:  " << a << "\n";
  151.         std::cout << "b:  " << b << "\n";
  152.         std::cout << "a+b:" << a + b << "\n";
  153.         std::cout << "2*b:" << 2* b << "\n";
  154.         std::cout << "-a:" << -a << "\n";
  155.         std::cout << "a-b:" << a - b << "\n";
  156.         std::cout << "a-a:" << a - a << "\n";
  157.         std::cout << "<a, b>:" << dot(a, b) << "\n";
  158.         std::cout << "<a, a>:" << dot(a, a) << "\n
  159.         */
  160.         //std::cout << "||a||:" << norm(a) << "\n";
  161.     }
  162.     catch (std::exception& e) {
  163.         std::cerr << "Error:" << e.what();
  164.     }
  165. }
  166. using Punct2D = Vector2D;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement