标签:
欢迎来到德莱联盟。。。。
德莱文。。。
德莱文在逃跑,卡兹克在追。。。。
我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和中点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。
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 <iostream> using namespace std; int main() { //德莱文的起点与终点坐标 double dex1, dey1, dex2, dey2; //卡兹克的起点与终点坐标 double kax1, kay1, kax2, kay2; int n; cin >> n; while (n--) { cin >> dex1 >> dey1 >> dex2 >> dey2 >> kax1 >> kay1 >> kax2 >> kay2; //德莱文的斜率dek,常量b(直线的方程式y = kx + b) double dek, deb; dek = (dey2 - dey1) / (dex2 - dex1); deb = dey1 - dek * dex1; //卡兹克的斜率kak,常量b double kak, kab; kak = (kay2 - kay1) / (kax2 - kax1); kab = kay1 - kak * kax1; //因为不知道起点与终点的x的大小关系,所以需要先找出他们的大小关系,这里left指较小的x,right指较大的x double deLeftX, deRightX; double kaLeftX, kaRightX; if (dex1 > dex2) { //找出德莱文的左x和右x deLeftX = dex2; deRightX = dex1; } else { deLeftX = dex1; deRightX = dex2; } if (kax1 > kax2) { //找出卡兹克的左x和右x kaLeftX = kax2; kaRightX = kax1; } else { kaLeftX = kax1; kaRightX = kax2; } //如果这两个区间没有交集,那么这两条线段也就不可能相交 if (deRightX < kaLeftX || kaRightX < deLeftX) { cout << "Not Interseetion" << endl; continue; } if (dek == kak) { //斜率相同,无交点 cout << "Not Interseetion" << endl; continue; } else { //斜率不相同,判断两条线段是否相交 double InterseetionX; //求出两条直线的交点 InterseetionX = (kab - deb) / (dek - kak); //求出德莱文起点与终点区间与卡兹克起点与终点区间的交集 double leftX, rightX; if (deLeftX > kaLeftX) { leftX = deLeftX; } else { leftX = kaLeftX; } if (deRightX > kaRightX) { rightX = kaRightX; } else { rightX = deRightX; } //判断直线的交点在不在公共区间内,如果两条直线的交点在这两个区间的公共区间内,那么线段肯定相交 if (InterseetionX >= leftX && InterseetionX <= rightX) { cout << "Interseetion" << endl; } else { cout << "Not Interseetion" << endl; } } } return 0; }
标签:
原文地址:http://blog.csdn.net/bao_libra/article/details/51333569