#include <iostream>
#include <cmath>

using namespace std;

class Point {
  public:
    Point(int x = 0, int y = 0) : x(x), y(y) {}
    int getx() const;
    int gety() const;
  private:
    int x, y;
};

class Pixel: public Point {
  public:
    Pixel(int x, int y, int color) : Point(x, y), color(color) {}
  private:
    int color;
};


int Point::getx() const {
    return this->x;
};

int Point::gety() const {
    return this->y;
};

ostream &operator<<(ostream& s, const Point &p) {
    s << "(" << p.getx() <<  ", " << p.gety() << ")";

    return s;
}

// lepiej to zrobić ogólniej, tzn. np. obliczyć odległość
//float distance(Point p, Point q) {      // save on CPU cycles and memory usage
float distance(Point &p, Point &q) {
    float dx = q.getx() - p.getx();
    float dy = q.gety() - p.gety();

    return sqrt(dx * dx + dy * dy);     // euclidean distance
}

//void show_distance(Point p, Point q) {      // save on CPU cycles and memory usage
void show_distance(Point &p, Point &q) {
     cout << "distance between points " << p << " and " << q
            << " is " << distance(p, q) << endl;
}


int main() {
    Point p1(1, 2), p2(3, 4);
    Pixel px1(7, 3, 128), px2(5, 11, 256);

    show_distance(p1, p2);
    show_distance(px1, px2);
    show_distance(p1, px2);

    return 0;
}
