给定二维空间中 y = mx + b 形式的 N 行和一个垂直截面。我们需要找出给定部分内是否有交点。
例子:
In below diagram four lines are there,
L1 : y = x + 2
L2 : y = -x + 7
L3 : y = -3
L4 : y = 2x – 7
and vertical section is given from x = 2 to x = 4
We can see that in above diagram, the
intersection point of line L1 and L2
lies between the section.
我们可以使用排序来解决这个问题。首先,我们将计算每条线与垂直截面边界的交点并将其存储为一对。我们只需要将交叉点的 y 坐标存储为一对,因为 x 坐标等于边界本身。现在我们将根据它们与左边界的交集对这些对进行排序。之后,我们将逐个循环这些对,如果对于任何两个连续的对,当前对的第二个值小于前一个对的第二个值的值,那么在给定的垂直部分中必须有一个交集.
可以在上图中 L1 和 L2 的图中看到两个连续对的可能方向。我们可以看到,当第二个值较小时,交点位于垂直截面。
解决方案的总时间复杂度为 O(n logn)
CPP
// C++ program to check an intersection point
// inside a given vertical section
#include
using namespace std;
// structure to represent a line
struct line {
int m, b;
line() { }
line(int m, int b) : m(m), b(b) { }
};
// Utility method to get Y-coordinate
// corresponding to x in line l
int getYFromLine(line l, int x)
{
return (l.m * x + l.b);
}
// method returns true if two line cross
// each other between xL and xR range
bool isIntersectionPointInsideSection(line lines[],
int xL, int xR, int N)
{
pair yBoundary[N];
// first calculating y-values and putting
// in boundary pair
for (int i = 0; i < N; i++)
yBoundary[i] = make_pair(getYFromLine(lines[i], xL),
getYFromLine(lines[i], xR));
// sorting the pair on the basis of first
// boundary intersection
sort(yBoundary, yBoundary + N);
// looping over sorted pairs for comparison
for (int i = 1; i < N; i++) {
// if current pair's second value is smaller
// than previous pair's then return true
if (yBoundary[i].second < yBoundary[i - 1].second)
return true;
}
return false;
}
// Driver code to test above methods
int main()
{
int N = 4;
int m[] = { 1, -1, 0, 2 };
int b[] = { 2, 7, -3, -7 };
// copy values in line struct
line lines[N];
for (int i = 0; i < N; i++) {
lines[i] = line(m[i], b[i]);
int xL = 2;
int xR = 4;
if (isIntersectionPointInsideSection(lines, xL, xR, N)) {
cout << "Intersection point lies between "
<< xL << " and " << xR << endl;
} else {
cout << "No Intersection point lies between "
<< xL << " and " << xR << endl;
}
}
输出:
Intersection point lies between 2 and 4
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。