📜  查找截面内线的交点

📅  最后修改于: 2021-10-23 08:18:20             🧑  作者: Mango

给定二维空间中 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 现场工作专业课程学生竞争性编程现场课程。