poj 1269 Intersecting Lines[直线的关系]

题目链接: poj 1269

 题目的意思很是简单,两条直线的关系,平行,共线,或者给出交点。

Code:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const double eps = 1e-8;
struct POINT{
    double x, y;
};

double cross(POINT o, POINT a, POINT b){
    return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}

double cross(POINT a, POINT b, POINT c, POINT d){
    return (b.x - a.x) * (d.y - c.y) - (d.x - c.x) * (b.y - a.y);
}

double f(POINT a, POINT b, double x){
    return x * (b.y - a.y) + a.y * b.x - a.x * b.y;
}

void TheRelationshipOfTwoLine(POINT p1, POINT p2, POINT p3,POINT p4){ //p1p2,p3p4
    if(fabs(cross(p1, p2, p3)) < eps && fabs(cross(p1, p2, p4)) < eps){// line
        puts("LINE");
    }
    else if(fabs(cross(p1, p2, p3, p4)) < eps){// //
        puts("NONE");
    }
    else {
        if(p2.x == p1.x && p3.x != p4.x){// special judge p1p2 |x
            printf("POINT %.2f %.2f\n", p2.x, f(p3, p4, p2.x) / (p4.x - p3.x));
        }
        else if(p3.x == p4.x && p1.x != p2.x){ // special judge p3p4 |x
            printf("POINT %.2f %.2f\n", p3.x, f(p1, p2, p3.x) / (p2.x - p1.x));
        }
        else{
            double k1 = (p2.y - p1.y) / (p2.x - p1.x), k2 = (p4.y - p3.y) / (p4.x - p3.x);
            double x = (p1.x * k1 - p3.x * k2 + p3.y - p1.y) / (k1 - k2);
            double y = k1 * (x - p1.x) + p1.y;
            printf("POINT %.2f %.2f\n",x, y);
        }
    }
}
int main(){
    int T;
    scanf("%d", &T);
    puts("INTERSECTING LINES OUTPUT");
    while(T --){
        POINT p1, p2, p3, p4;
        scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&p1.x, &p1.y, &p2.x, &p2.y, &p3.x, &p3.y, &p4.x, &p4.y);
        TheRelationshipOfTwoLine(p1, p2, p3, p4);
    }
    puts("END OF OUTPUT");
    return 0;
<span style="font-size:18px;">}
</span>

留下小小的模板吧。。。!

代码比较优美的又写了一遍,不过这次用到的不是求斜率来求解交点。而是应用到了定比分点公式来进行求解。。。

Code:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const int N = 20;
const double eps = 1e-8;
const double pi = acos(-1);
//点
struct POINT
{
    double x, y;
    POINT(){ }
    POINT(double a, double b){
        x = a;
        y = b;
    }
};

//直线
struct Line
{
    POINT a, b;
    Line() {}
    Line(POINT x, POINT y){
        a = x;
        b = y;
    }
}l1, l2;

//叉乘
double cross(POINT o, POINT a, POINT b)
{
    return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}

int Line_cross(Line l1, Line l2)
{
    //两条直线平行
    if(fabs(cross(l1.a, l2.a, l2.b) - cross(l1.b, l2.a, l2.b)) < eps && fabs(cross(l1.a, l2.a, l2.b)) > eps) return 0;
    //重合..
    if(fabs(cross(l1.a, l2.a, l2.b)) < eps && fabs(cross(l1.b, l2.a, l2.b)) < eps) return 2;
    //有交点///
    return 1;
}

POINT Inter(Line l1, Line l2)
{
    double k = fabs(cross(l1.a, l2.a, l2.b)) / fabs(cross(l1.b, l2.a, l2.b));
    return POINT((l1.a.x + l1.b.x * k) / (1 + k), (l1.a.y + l1.b.y * k) / (1 + k));
}

int main()
{
    int n;
    while(~scanf("%d", &n)){
        puts("INTERSECTING LINES OUTPUT");
        for(int i = 0; i < n; i ++){
            scanf("%lf %lf %lf %lf", &l1.a.x, &l1.a.y, &l1.b.x, &l1.b.y);
            scanf("%lf %lf %lf %lf", &l2.a.x, &l2.a.y, &l2.b.x, &l2.b.y);
            int cnt = Line_cross(l1, l2);
            if(cnt == 0){
                puts("NONE");
            }
            else if(cnt == 1){
                POINT ans = Inter(l1, l2);
                printf("POINT %.2f %.2f\n", ans.x, ans.y);
            }
            else {
                puts("LINE");
            }
        }
        puts("END OF OUTPUT");
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值