プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

2つの線分が交差しているかどうかを確認します


2つの線分を指定します。最初の線分からの点p1、p2、および2番目の線分からの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:
Points of two line-segments
Line-segment 1: (0, 0) to (5, 5)
Line-segment 2: (2, -10) to (3, 10)
Output:
Lines are intersecting

アルゴリズム

direction(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, then
      return anti-clockwise
   return clockwise
End

isIntersect(l1、l2)

入力: 2つの線分。各線には2つの点p1とp2があります。

出力: 確かに、それらが交差しているとき。

Begin
   dir1 = direction(l1.p1, l1.p2, l2.p1);
   dir2 = direction(l1.p1, l1.p2, l2.p2);
   dir3 = direction(l2.p1, l2.p2, l1.p1);
   dir4 = direction(l2.p1, l2.p2, l1.p2);

   if dir1 ≠ dir2 and dir3 ≠ dir4, then
      return true
   if dir1 =0 and l2.p1 on the line l1, then
      return true
   if dir2 = 0 and l2.p2 on the line l1, then
      return true
   if dir3 = 0 and l1.p1 on the line l2, then
      return true
   if dir4 = 0 and l1.p2 on the line l2, then
      return true
   return false
End

#include<iostream>
using namespace std;

struct Point {
   int x, y;
};

struct line {
   Point p1, p2;
};

bool onLine(line l1, Point p) {   //check whether p is on the line or not
   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)))
      return true;
   
   return false;
}

int direction(Point a, Point b, Point c) {
   int val = (b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y);
   if (val == 0)
      return 0;     //colinear
   else if(val < 0)
      return 2;    //anti-clockwise direction
      return 1;    //clockwise direction
}

bool isIntersect(line l1, line l2) {
   //four direction for two lines and points of other line
   int dir1 = direction(l1.p1, l1.p2, l2.p1);
   int dir2 = direction(l1.p1, l1.p2, l2.p2);
   int dir3 = direction(l2.p1, l2.p2, l1.p1);
   int dir4 = direction(l2.p1, l2.p2, l1.p2);
   
   if(dir1 != dir2 && dir3 != dir4)
      return true; //they are intersecting

   if(dir1==0 && onLine(l1, l2.p1)) //when p2 of line2 are on the line1
      return true;

   if(dir2==0 && onLine(l1, l2.p2)) //when p1 of line2 are on the line1
      return true;

   if(dir3==0 && onLine(l2, l1.p1)) //when p2 of line1 are on the line2
      return true;

   if(dir4==0 && onLine(l2, l1.p2)) //when p1 of line1 are on the line2
      return true;
         
   return false;
}

int main() {
   line l1 = {{0,0}, {5, 5}};
   line l2 = {{2,-10}, {3, 10}};
   
   if(isIntersect(l1, l2))
      cout << "Lines are intersecting";
   else
      cout << "Lines are not intersecting";
}

出力

Lines are intersecting

  1. Matplotlibで2つの線分の交点を見つけるにはどうすればよいですか?

    Matplotlibで2つの線分の交点を見つけ、その点を水平線と垂直線に通すには、次の手順を実行します- 図のサイズを設定し、サブプロット間およびサブプロットの周囲のパディングを調整します。 勾配を使用して2本の線を作成します(m1、m2) (c1およびc2)をインターセプトします 。勾配と切片の値を初期化します。 xを作成します numpyを使用したデータポイント。 x、m1、m2、c2をプロット およびc1 plot()を使用したデータポイント メソッド。 切片と勾配値を使用して、交点を見つけます。 水平線と垂直線を点線でプロットします。 プロットxi およびyi プロット上の

  2. Matplotlibの2点間に線分をどのように作成しますか?

    matplotlibの2つのポイント間に線分を作成するには、次の手順を実行できます 図のサイズを設定し、サブプロット間およびサブプロットの周囲のパディングを調整します。 2つのポイントを作成するには、2つのリストを作成します。 xを抽出します およびy point1の値 およびpoint2 。 xをプロットします およびy plot()を使用した値 メソッド。 両方のポイントにテキストを配置します。 図を表示するには、 show()を使用します メソッド。 例 import matplotlib.pyplot as plt plt.rcParams["figure.