#include <iostream>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
struct Point
{
double x;
double y;
};
Point pClosest(vector<vector<double>> pts)
{
multimap<double, double> mp;
int k = 1;
Point p;
for (int i = 0; i < pts.size(); i++)
{
double x = pts[i][0], y = pts[i][1];
mp.insert({ (x * x) + (y * y) , i });
}
for (auto it = mp.begin();
it != mp.end() && k > 0;
it++, k--)
{
p.x = pts[it->second][0];
p.y = pts[it->second][1];
}
return p;
}
Point pFurthest(vector<vector<double>> pts)
{
double maxDistance = 0.0;
int maxDistanceIdx = 0;
for (int i = 0; i < pts.size(); i++)
{
double x = pts[i][0], y = pts[i][1];
double sum1 = 0 - x;
double sum2 = 0 - y;
double distance = sqrt(sum1 * sum1 + sum2 * sum2);
if (distance > maxDistance)
{
maxDistance = distance;
maxDistanceIdx = i;
}
}
Point p;
p.x = pts.at(maxDistanceIdx)[0], p.y = pts.at(maxDistanceIdx)[1];
return p;
}
int main()
{
vector<vector<double>> points = { { 8.0, 9.0 },
{ 4.0, 7.5 },
{ 1.0, 2.0 },
{ 5.1, 8.7 },
{ 9.0, 2.0 },
{ 4.5, 1.0 }
};
Point p1 = pClosest(points);
Point p2 = pFurthest(points);
cout << "Najbliższy punkt: " << p1.x << ", " << p1.y << endl;
cout << "Najdalszy punkty: " << p2.x << ", " << p2.y << endl;
double a = p2.x - p1.x;
double b = p2.y - p1.y;
double res = sqrt(a * a + b * b) / 2;
cout << "Promien okregu: " << res << endl;
Point midPoint;
double midX = (p1.x + p2.x) / 2;
double midY = (p1.y + p2.y) / 2;
midPoint.x = midX, midPoint.y = midY;
cout << "Wspolrzedne srodka okregu: " << midPoint.x << ", " << midPoint.y << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8Y21hdGg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFBvaW50CnsKICAgZG91YmxlIHg7CiAgIGRvdWJsZSB5Owp9OwoKUG9pbnQgcENsb3Nlc3QodmVjdG9yPHZlY3Rvcjxkb3VibGU+PiBwdHMpCnsKICAgbXVsdGltYXA8ZG91YmxlLCBkb3VibGU+IG1wOwogICBpbnQgayA9IDE7CiAgIFBvaW50IHA7CgogICBmb3IgKGludCBpID0gMDsgaSA8IHB0cy5zaXplKCk7IGkrKykKICAgewogICAgICBkb3VibGUgeCA9IHB0c1tpXVswXSwgeSA9IHB0c1tpXVsxXTsKICAgICAgbXAuaW5zZXJ0KHsgKHggKiB4KSArICh5ICogeSkgLCBpIH0pOwogICB9CgogICBmb3IgKGF1dG8gaXQgPSBtcC5iZWdpbigpOwogICAgICBpdCAhPSBtcC5lbmQoKSAmJiBrID4gMDsKICAgICAgaXQrKywgay0tKQogICB7CiAgICAgIHAueCA9IHB0c1tpdC0+c2Vjb25kXVswXTsKICAgICAgcC55ID0gcHRzW2l0LT5zZWNvbmRdWzFdOwogICB9CgogICByZXR1cm4gcDsKfQoKUG9pbnQgcEZ1cnRoZXN0KHZlY3Rvcjx2ZWN0b3I8ZG91YmxlPj4gcHRzKQp7CiAgIGRvdWJsZSBtYXhEaXN0YW5jZSA9IDAuMDsKICAgaW50IG1heERpc3RhbmNlSWR4ID0gMDsKCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRzLnNpemUoKTsgaSsrKQogICB7CiAgICAgIGRvdWJsZSB4ID0gcHRzW2ldWzBdLCB5ID0gcHRzW2ldWzFdOwogICAgICBkb3VibGUgc3VtMSA9IDAgLSB4OwogICAgICBkb3VibGUgc3VtMiA9IDAgLSB5OwogICAgICBkb3VibGUgZGlzdGFuY2UgPSBzcXJ0KHN1bTEgKiBzdW0xICsgc3VtMiAqIHN1bTIpOwogICAgICBpZiAoZGlzdGFuY2UgPiBtYXhEaXN0YW5jZSkKICAgICAgewogICAgICAgICBtYXhEaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgICBtYXhEaXN0YW5jZUlkeCA9IGk7CiAgICAgIH0KICAgfQoKICAgUG9pbnQgcDsKICAgcC54ID0gcHRzLmF0KG1heERpc3RhbmNlSWR4KVswXSwgcC55ID0gcHRzLmF0KG1heERpc3RhbmNlSWR4KVsxXTsKICAgcmV0dXJuIHA7Cn0KCmludCBtYWluKCkKewogICB2ZWN0b3I8dmVjdG9yPGRvdWJsZT4+IHBvaW50cyA9IHsgeyA4LjAsIDkuMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyA0LjAsIDcuNSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxLjAsIDIuMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyA1LjEsIDguNyB9LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgOS4wLCAyLjAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgNC41LCAxLjAgfQogICB9OwoKICAgUG9pbnQgcDEgPSBwQ2xvc2VzdChwb2ludHMpOwogICBQb2ludCBwMiA9IHBGdXJ0aGVzdChwb2ludHMpOwoKICAgY291dCA8PCAiTmFqYmxpxbxzenkgcHVua3Q6ICIgPDwgcDEueCA8PCAiLCAiIDw8IHAxLnkgPDwgZW5kbDsKICAgY291dCA8PCAiTmFqZGFsc3p5IHB1bmt0eTogIiA8PCBwMi54IDw8ICIsICIgPDwgcDIueSA8PCBlbmRsOwogICBkb3VibGUgYSA9IHAyLnggLSBwMS54OwogICBkb3VibGUgYiA9IHAyLnkgLSBwMS55OwogICBkb3VibGUgcmVzID0gc3FydChhICogYSArIGIgKiBiKSAvIDI7CiAgIGNvdXQgPDwgIlByb21pZW4gb2tyZWd1OiAiIDw8IHJlcyA8PCBlbmRsOwogICBQb2ludCBtaWRQb2ludDsKICAgZG91YmxlIG1pZFggPSAocDEueCArIHAyLngpIC8gMjsKICAgZG91YmxlIG1pZFkgPSAocDEueSArIHAyLnkpIC8gMjsKICAgbWlkUG9pbnQueCA9IG1pZFgsIG1pZFBvaW50LnkgPSBtaWRZOwogICBjb3V0IDw8ICJXc3BvbHJ6ZWRuZSBzcm9ka2Egb2tyZWd1OiAiIDw8IG1pZFBvaW50LnggPDwgIiwgIiA8PCBtaWRQb2ludC55IDw8IGVuZGw7CiAgIHJldHVybiAwOwp9