Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

두 선분이 교차하는지 확인


두 개의 라인 세그먼트가 주어집니다. 첫 번째 선분에서 점 p1, p2, 두 번째 선분에서 q1, q2. 두 선분이 교차하는지 여부를 확인해야 합니다.

다음 경우가 충족되면 두 선분 모두 교차한다고 말할 수 있습니다.

  • (p1, p2, q1)과 (p1, p2, q2)의 방향이 다르고
  • (q1, q2, p1) 및 (q1, q2, p2) 방향이 다릅니다.

또 다른 조건은 (p1, p2, q1), (p1, p2, q2), (q1, q2, p1), (q1, q2, p2)가 공선일 때입니다.

입력 및 출력

Input:두 선분의 점Line-segment 1:(0, 0) ~ (5, 5)Line-segment 2:(2, -10) ~ (3, 10)Output:선이 교차합니다. 

알고리즘

방향(a, b, c)

입력: 3점.

출력: 동일선상에 있는지 시계 반대 방향 또는 시계 방향인지 확인하십시오.

Begin val :=(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y) if val =0, then return collinear else if val <0, 그 다음 반시계 방향 반환 시계방향End

isIntersect(l1, l2)

입력: 두 개의 선분, 각 선에는 두 개의 점 p1과 p2가 있습니다.

출력: 사실, 교차할 때입니다.

시작 dir1 =방향(l1.p1, l1.p2, l2.p1); dir2 =방향(l1.p1, l1.p2, l2.p2); dir3 =방향(l2.p1, l2.p2, l1.p1); dir4 =방향(l2.p1, l2.p2, l1.p2); dir1 ≠ dir2 및 dir3 ≠ dir4이면 라인 l1에서 dir1 =0 및 l2.p1이면 true를 반환하고 라인 l1에서 dir2 =0이고 l2.p2이면 true를 반환하고 dir3 =0 및 l1이면 true를 반환합니다. 라인 l2에서 .p1, dir4 =0이고 라인 l2에서 l1.p2이면 true를 반환하고 true를 반환하면 falseEnd를 반환합니다.

예시

#includeusing namespace std;struct Point { int x, y;};struct line { Point p1, p2;};bool onLine(line l1, Point p) { //p가 위에 있는지 확인 라인 여부 if(p.x <=max(l1.p1.x, l1.p2.x) &&p.x <=min(l1.p1.x, l1.p2.x) &&(p.y <=max(l1.p1) .y, l1.p2.y) &&p.y <=min(l1.p1.y, l1.p2.y))) true를 반환합니다. return false;}int 방향(점 a, 점 b, 점 c) { int val =(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y); if (val ==0) 반환 0; // 동일선상 else if(val <0) return 2; //반시계 방향 return 1; //시계 방향}bool isIntersect(line l1, line l2) { //두 개의 선과 다른 선의 점에 대한 네 방향 int dir1 =direction(l1.p1, l1.p2, l2.p1); int dir2 =방향(l1.p1, l1.p2, l2.p2); int dir3 =방향(l2.p1, l2.p2, l1.p1); int dir4 =방향(l2.p1, l2.p2, l1.p2); if(dir1 !=dir2 &&dir3 !=dir4) true를 반환합니다. //교차합니다 if(dir1==0 &&onLine(l1, l2.p1)) // line2의 p2가 line1에 있을 때 return true; if(dir2==0 &&onLine(l1, l2.p2)) // line2의 p1이 line1에 있을 때 true를 반환합니다. if(dir3==0 &&onLine(l2, l1.p1)) // line1의 p2가 line2에 있을 때 true를 반환합니다. if(dir4==0 &&onLine(l2, l1.p2)) // line1의 p1이 line2에 있을 때 true를 반환합니다. return false;}int main() { line l1 ={{0,0}, {5, 5}}; 라인 l2 ={{2,-10}, {3, 10}}; if(isIntersect(l1, l2)) cout <<"선이 교차합니다"; else cout <<"선이 교차하지 않습니다";}

출력

선이 교차합니다