XYNUOJ-2139 德莱联盟

2139: 德莱联盟

时间限制: 1 Sec   内存限制: 64 MB
提交: 7   解决: 3
您该题的状态:已完成
[提交][状态][讨论版]

题目描述

欢迎来到德莱联盟。。。。

德莱文。。。

德莱文在逃跑,卡兹克在追。。。。

我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和 终点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。

输入

几组数据,一个整数T表示T组数据 每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标

输出

如果可能 输出 Interseetion,否则输出 Not Interseetion

样例输入

2
-19.74 7.14 22.23 -27.45 -38.79 -5.08 47.51 34.01
-8.61 9.91 -32.47 6.47 -3.81 -16.1 7.82 -6.37

样例输出

Interseetion
Not Interseetion


一个简单的判断两条线段是否相交的问题,不知道如何判断两条线段是否相交的请看:

#include <stdio.h>
#define PY printf("Interseetion\n")
#define PN printf("Not Interseetion\n")

struct Node {
	double x;
	double y;
};

//判断直线AB是否与线段CD相交
bool lineInSide( Node A, Node B, Node C, Node D) {
	// A(x1, y1), B(x2, y2)的直线方程为:
	// f(x, y) =  (y - y1) * (x1 - x2) - (x - x1) * (y1 - y2) = 0
	double fC = (C.y - A.y) * (A.x - B.x) - (C.x - A.x) * (A.y - B.y);
	double fD = (D.y - A.y) * (A.x - B.x) - (D.x - A.x) * (A.y - B.y);
	if(fC * fD > 0)
		return false;
	return true;
}

//判断线段AB和线段CD是否相交 
bool sideInSide( Node A, Node B, Node C, Node D) {
	if(!lineInSide(A, B, C, D))
		return false;
	if(!lineInSide(C, D, A, B))
		return false;
	return true;
}

int main() {
	int t;
	Node s1,s2,e1,e2;
	scanf( "%d",&t );
	while( t-- ) {
		scanf( "%lf%lf%lf%lf%lf%lf%lf%lf",&s1.x,&s1.y,&e1.x,&e1.y,&s2.x,&s2.y,&e2.x,&e2.y );
		if( sideInSide( s1,e1,s2,e2 ) )
			PY;
		else
			PN;
	}
}
有其他想法欢迎留言讨论哦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值