Intersecting Lines POJ

来源:互联网 发布:京东大数据认证考试 编辑:程序博客网 时间:2024/06/08 04:44
#include <cmath>#include <cstdio>using namespace std;/*判断直线是否相交或者共线,并求出交点*/const double ESP = 1e-10;int dcmp(double x) {    if (fabs(x) < ESP) {        return 0;    } else {        return x < 0 ? -1 : 1;    }}//点struct Point {    double x, y;    Point(double x = 0, double y = 0) : x(x), y(y) {}};//向量typedef Point Vector;Vector operator+(Vector A, Vector B) {    return Vector(A.x + B.x, A.y + B.y);}Vector operator-(Point A, Point B) {    return Vector(A.x - B.x, A.y - B.y);}Vector operator*(Vector A, double k) {    return Vector(A.x * k, A.y * k);}Vector operator/(Vector A, double k) {    return Vector(A.x / k, A.y / k);}bool operator<(const Point &A, const Point &B) {    return A.x < B.x || (A.x == B.x && A.y < B.y);}bool operator==(const Point &A, const Point &B) {    return dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0;}double Dot(Vector A, Vector B) {    return A.x * B.x + A.y * B.y;}double Cross(Vector A, Vector B) {    return A.x * B.y - A.y * B.x;}//一个点是否在直线上bool OnLine(Point A, Point B, Point P) {    return dcmp(Cross(A - P, B - P)) == 0;}//两直线平行bool isLineParallel(Point A, Point B, Point C, Point D) {    return dcmp(Cross(A - B, C - D)) == 0 && !OnLine(A, B, C);}//两直线共线bool isLineCommon(Point A, Point B, Point C, Point D) {    return dcmp(Cross(A - B, C - D)) == 0 && OnLine(A, B, C);}//两直线交点Point GetLineIntersection(Point P, Vector v, Point Q, Vector w) {    Vector u = P - Q;    double t = Cross(w, u) / Cross(v, w);    return P + v * t;}const int MAXN = 100 + 5;Point points[MAXN];int n;void slove() {    printf("INTERSECTING LINES OUTPUT\n");    for (int i = 0; i < n - 1; i += 4) {        if (isLineCommon(points[i], points[i + 1], points[i + 2], points[i + 3])) {            printf("LINE\n");        } else if (isLineParallel(points[i], points[i + 1], points[i + 2], points[i + 3])) {            printf("NONE\n");        } else {            Point ans = GetLineIntersection(points[i], points[i + 1] - points[i], points[i + 2], points[i + 3] - points[i + 2]);            printf("POINT %.2lf %.2lf\n", ans.x, ans.y);//g++有毒.2f可以过.2lf过不了,或者用c++        }    }    printf("END OF OUTPUT\n");}int main() {    scanf("%d", &n);    n *= 4;    for (int i = 0; i < n; i += 4) {        scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &points[i].x, &points[i].y, &points[i + 1].x, &points[i + 1].y,              &points[i + 2].x, &points[i + 2].y, &points[i + 3].x, &points[i + 3].y);    }    slove();    return 0;}

原创粉丝点击