y =mx + c 형식의 선 집합이 있다고 가정합니다. 이 선과 수직 단면에 의해 만들어진 섹션이 있습니다. 우리는 주어진 섹션에 존재하는 교차점을 찾아야 합니다. 라인이 다음과 같다고 가정합니다 -
L1 =y =x + 2
L2 =y =-x + 7
L3 =y =-3
L4 =y =2x - 7
그리고 수직 단면은 x =2에서 x =4까지 주어집니다.
여기 L1과 L2의 교차점이 이 섹션 안에 있으므로 답은 참입니다.
이 문제를 해결하기 위해 정렬 기술을 고소합니다. 먼저 수직 단면의 두 경계를 사용하여 각 선의 교차점을 계산합니다. 그 후에 그것을 쌍으로 저장하십시오. x 좌표가 경계 자체와 같기 때문에 교차점의 y 좌표 값을 쌍으로 저장하기만 하면 됩니다.
이제 왼쪽 경계와의 교차점을 기준으로 이 쌍을 정렬합니다. 그런 다음 이 쌍을 하나씩 반복합니다. 두 개의 연속 쌍에 대해 현재 쌍의 두 번째 값이 이전 쌍의 두 번째 값보다 작으면 주어진 수직 섹션에 교차점이 있어야 합니다.
예시
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
class line {
public:
int slope, intercept;
line(){
}
line(int slope, int intercept) : slope(slope), intercept(intercept) {
}
};
int getYCoordinate(line l, int x) {
return (l.slope * x + l.intercept);
}
bool hasIntersectionPoint(line lines[], int left_range, int right_range, int N) {
pair<int, int> y_border[N];
for (int i = 0; i < N; i++)
y_border[i] = make_pair(getYCoordinate(lines[i], left_range), getYCoordinate(lines[i], right_range));
sort(y_border, y_border + N);
for (int i = 1; i < N; i++) {
if (y_border[i].second < y_border[i - 1].second)
return true;
}
return false;
}
int main() {
int N = 4;
int slope[] = { 1, -1, 0, 2 };
int intercept[] = { 2, 7, -3, -7 };
line lines[N];
for (int i = 0; i < N; i++)
lines[i] = line(slope[i], intercept[i]);
int left_range = 2;
int right_range = 4;
if (hasIntersectionPoint(lines, left_range, right_range, N)) {
cout << "The intersection point is lies between " << left_range << " and " << right_range;
} else {
cout << "No intersection point is present in between " << left_range << " and " << right_range;
}
} 출력
The intersection point is lies between 2 and 4