Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define FASTER() ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
- #define ff first
- #define ss second
- #define pb push_back
- #define all(a) a.begin(), a.end()
- #define dbg(x) cerr<<" "<<#x<<" "<<x<<endl
- typedef long double ld;
- typedef long long ll;
- using namespace std;
- struct point {
- ld x, y;
- point() {}
- point(ld x, ld y) : x(x), y(y) {}
- point operator - (point p) {
- return point(x - p.x, y - p.y);
- }
- ld len() {
- return sqrtl(x * x + y * y);
- }
- };
- istream &operator >> (istream &in, point &p) {
- in >> p.x >> p.y;
- return in;
- }
- ld dot(point a, point b) {
- return a.x * b.x + a.y * b.y;
- }
- ld cross(point a, point b) {
- return a.x * b.y - a.y * b.x;
- }
- struct line {
- ld a, b, c;
- line() {}
- line(point p1, point p2) {
- a = p2.y - p1.y;
- b = p1.x - p2.x;
- c = p1.y * p2.x - p2.y * p1.x;
- }
- ld dist(point p) {
- return abs((ld)(a * p.x + b * p.y + c) / sqrtl(a * a + b * b));
- }
- };
- const ld eps = 1e-6;
- bool equals(ld a, ld b) {
- return abs(a - b) < eps;
- }
- bool positive(ld a) {
- return a - eps >= 0;
- }
- point intersec(line fi, line se) {
- ld d = (ld)fi.a * se.b - fi.b * se.a;
- ld x = (ld)(-fi.c * se.b + se.c * fi.b) / d, y = (ld)(-fi.a * se.c + se.a * fi.c) / d;
- return point(x, y);
- }
- ld pointToRay(point p, point a, point b) {
- point ap = p - a;
- if(dot(b - a, p - a) <= 0) {
- return ap.len();
- }
- point ab = b - a;
- return (ld)abs(cross(b - a, p - a)) / ab.len();
- }
- ld pointToSegment(point p, point a, point b) {
- if(dot(b - a, p - a) <= 0) {
- point ap = p - a;
- return ap.len();
- }
- if(dot(a - b, p - b) <= 0) {
- point bp = p - b;
- return bp.len();
- }
- point ab = a - b;
- return (ld)abs(cross(b - a, p - a)) / ab.len();
- }
- ld pointToLine(point p, point a, point b) {
- line l(a, b);
- return l.dist(p);
- }
- bool pointOnRay(point p, point a, point b) {
- return positive(dot(p - a, b - a));
- }
- bool pointOnSegment(point p, point a, point b) {
- return pointOnRay(p, a, b) && pointOnRay(p, b, a);
- }
- ld rayToRay(point a, point b, point c, point d) {
- ld dist = min(pointToRay(a, c, d), pointToRay(c, a, b));
- line ab(a, b), cd(c, d);
- point in = intersec(ab, cd);
- if(pointOnRay(in, a, b) && pointOnRay(in, c, d)) {
- dist = 0;
- }
- return dist;
- }
- ld segToRay(point a, point b, point c, point d) {
- ld dist = min(pointToRay(a, c, d), pointToRay(b, c, d));
- line ab(a, b), cd(c, d);
- point in = intersec(ab, cd);
- if(pointOnSegment(in, a, b) && pointOnRay(in, c, d)) {
- dist = 0;
- }
- return dist;
- }
- ld segToSeg(point a, point b, point c, point d) {
- ld dist = min(pointToSegment(a, c, d), pointToSegment(b, c, d));
- dist = min(dist, min(pointToSegment(c, a, b), pointToSegment(d, a, b)));
- if(cross(d - c, a - c) * cross(d - c, b - c) <= 0 &&
- cross(b - a, c - a) * cross(b - a, d - c) <= 0) {
- dist = 0;
- }
- return dist;
- }
- ld rayToLine(point a, point b, point c, point d) {
- line ab(a, b), cd(c, d);
- ld dist = cd.dist(a);
- point in = intersec(ab, cd);
- if(pointOnRay(in, a, b)) {
- dist = 0;
- }
- return dist;
- }
- ld segToLine(point a, point b, point c, point d) {
- line ab(a, b), cd(c, d);
- ld dist = min(pointToLine(a, c, d), pointToLine(b, c, d));
- point in = intersec(ab, cd);
- if(pointOnSegment(in, a, b)) {
- dist = 0;
- }
- return dist;
- }
- ld lineToLine(point a, point b, point c, point d) {
- if(cross(b - a, d - c) != 0) {
- return 0;
- }
- return pointToLine(a, c, d);
- }
- int main() {
- FASTER();
- cout.precision(30);
- point a, b, c, d;
- cin >> a >> b >> c >> d;
- point ac = c - a; //1. Расстояние от точки A до точки C.
- cout << ac.len() << '\n';
- cout << pointToSegment(a, c, d) << '\n'; //2. Расстояние от точки A до отрезка CD.
- cout << pointToRay(a, c, d) << '\n'; //3. Расстояние от точки A до луча CD.
- cout << pointToLine(a, c, d) << '\n'; //4. Расстояние от точки A до прямой CD.
- cout << pointToSegment(c, a, b) << '\n'; //5. Расстояние от отрезка AB до точки C
- cout << segToSeg(a, b, c, d) << '\n'; //6. Расстояние от отрезка AB до отрезка CD
- cout << segToRay(a, b, c, d) << '\n'; //7. Расстояние от отрезка AB до луча CD.
- cout << segToLine(a, b, c, d) << '\n'; //8. Расстояние от отрезка AB до прямой CD.
- cout << pointToRay(c, a, b) << '\n'; //9. Расстояние от луча AB до точки C.
- cout << segToRay(c, d, a, b) << '\n'; //10. Расстояние от луча AB до отрезка CD.
- cout << rayToRay(a, b, c, d) << '\n'; //11. Расстояние от луча AB до луча CD.
- cout << rayToLine(a, b, c, d) << '\n'; //12. Расстояние от луча AB до прямой CD
- cout << pointToLine(c, a, b) << '\n'; //13. Расстояние от прямой AB до точки C
- cout << segToLine(c, d, a, b) << '\n'; //14. Расстояние от прямой AB до отрезка CD
- cout << rayToLine(c, d, a, b) << '\n'; //15. Расстояние от прямой AB до луча CD.
- cout << lineToLine(a, b, c, d); //16. Расстояние от прямой AB до прямой CD.
- }
Add Comment
Please, Sign In to add comment