Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include "utils.h"
- struct Vector2D {
- union {
- struct {
- double x, y;
- };
- double data[2];
- };
- constexpr double* begin() { return data; }
- constexpr const double* begin() const { return data; }
- constexpr double* end() { return data + 2; }
- constexpr const double* end() const { return data + 2; }
- constexpr Vector2D() : x(0), y(0) {}
- constexpr Vector2D(double x, double y) : x(x), y(y) {}
- constexpr size_t size() const { return 2; }
- constexpr double& operator[](size_t i) { return data[i]; }
- constexpr double operator[](size_t i) const { return data[i]; }
- friend std::ostream& operator<<(std::ostream& s, const Vector2D& v) {
- return s << "(" << v.x << ", " << v.y << ")";
- }
- static auto read() {
- Vector2D res;
- for (auto& v : res) std::cin >> v;
- return res;
- }
- double norm() const;
- double norm2() const;
- Vector2D operator+(Vector2D rhs) const {
- return Vector2D(rhs.x + x, rhs.y + y);
- }
- Vector2D& operator+=(Vector2D rhs) {
- x += rhs.x;
- y += rhs.y;
- return *this;
- }
- Vector2D operator-() const {
- return Vector2D(-x, -y);
- }
- Vector2D operator-(Vector2D rhs) const {
- return Vector2D(rhs.x - x, rhs.y - y);
- }
- Vector2D operator*(double rhs) const {
- return Vector2D(rhs * x, rhs * y);
- }
- friend Vector2D operator*(double lhs, Vector2D rhs) {
- return Vector2D(rhs.x*lhs, rhs.y * lhs);
- }
- };
- double dot(const Vector2D& a, const Vector2D& b) {
- double res = 0;
- auto bIt = b.begin();
- for (auto& v : a) res += v * (*(bIt++));
- return res;
- }
- double norm2(const Vector2D& a) {
- return dot(a, a);
- }
- double norm(const Vector2D& a) {
- return std::sqrt(dot(a, a));
- }
- double Vector2D::norm() const {
- return ::norm(*this);
- }
- double Vector2D::norm2() const {
- return ::norm2(*this);
- }
- double distance(Vector2D a, Vector2D b) {
- return norm(a - b);
- }
- double det(Vector2D a, Vector2D b, Vector2D c) {
- return a.x * b.y + b.x * c.y + a.y *c.x -
- c.x * b.y - c.y * a.x - a.y * b.x;
- }
- bool coliniar(Vector2D a, Vector2D b, Vector2D c) {
- return det(a, b,c) < eps;
- }
- struct Cerc {
- double r;
- Vector2D center;
- };
- Cerc cerc(Vector2D a, Vector2D b, Vector2D c) {
- double area = std::abs(det(a, b, c));
- if (area< eps) throw std::logic_error("Points are coliniar");
- double l1 = distance(a, b);
- double l2 = distance(a, c);
- double l3 = distance(c, b);
- Vector2D o{
- norm(a) * (b.y - c.y) + norm(b) * ( norm(c),
- 0
- };
- return Cerc((l1*l2*l3) / (4 * area), o);
- }
- void test() {
- try {
- int n = readSize("n");
- Vector2D *v = new Vector2D[n];
- v[0] = Vector2D::read();
- Vector2D max = v[0];
- double maxNorm = max.norm2();
- Vector2D min = v[0];
- double minNorm = maxNorm;
- Vector2D sum = v[0];
- for (int i = 1; i < n; ++i) {
- v[i] = Vector2D::read();
- auto& vec = v[i];
- sum += vec;
- auto norm = vec.norm2();
- if (norm > maxNorm) {
- maxNorm = norm;
- max = vec;
- }
- else if (norm < minNorm) {
- minNorm = norm;
- min = vec;
- }
- }
- std::cout << "max:" << max << ";" << max.norm() << "\n";
- std::cout << "min:" << min << ";" << min.norm() << "\n";
- std::cout << "sum" << sum << "\n";
- /*
- Vector2D a = Vector2D::read();// { 3, 4, };
- Vector2D b = Vector2D::read();// { 3, 4, };
- // Vector2D b{ 2, 3,};
- std::cout << "a: " << a << "\n";
- std::cout << "b: " << b << "\n";
- std::cout << "a+b:" << a + b << "\n";
- std::cout << "2*b:" << 2* b << "\n";
- std::cout << "-a:" << -a << "\n";
- std::cout << "a-b:" << a - b << "\n";
- std::cout << "a-a:" << a - a << "\n";
- std::cout << "<a, b>:" << dot(a, b) << "\n";
- std::cout << "<a, a>:" << dot(a, a) << "\n
- */
- //std::cout << "||a||:" << norm(a) << "\n";
- }
- catch (std::exception& e) {
- std::cerr << "Error:" << e.what();
- }
- }
- using Punct2D = Vector2D;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement