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

C++를 사용하여 주어진 점에서 가능한 사변형의 수 찾기

<시간/>

사변형은 유클리드 평면 기하학에서 4개의 꼭짓점과 4개의 모서리가 있는 다각형을 형성합니다. 사각형 등의 이름. 사변형의 다른 이름에 포함되며 때로는 정사각형, 표시 스타일 등으로도 알려져 있습니다.

이 기사에서는 주어진 점에서 가능한 사변형의 수를 찾는 방법에 대해 설명합니다. 이 문제에서는 직교 평면에서 제공된 네 점( x, y )으로 만들 수 있는 사변형이 몇 개인지 알아낼 필요가 있습니다. 다음은 주어진 문제에 대한 예입니다 -

Input : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 )
Output : 1
Explanation : One quadrilateral can be formed ( ABCD )

C++를 사용하여 주어진 점에서 가능한 사변형의 수 찾기

Input : A( 1, 8 ), B( 0, 1 ), C( 4, 0 ), D( 1, 2 )
Output : 3
Explanation : 3 quadrilaterals can be formed (ABCD), (ABDC) and (ADBC).

해결 방법 찾기

  • 먼저 4개의 점 중 3개가 동일선상에 있는지 확인하고 동일선상에 있으면 사변형이 점으로 형성될 수 없습니다. .

  • 그 후 4점 중 2점이 동일한지 여부를 확인하고 동일하면 사변형을 만들 수 없습니다. .

  • 이제 대각선이 교차하는지 여부를 확인합니다. 그렇다면 만들 수 있는 사변형은 하나입니다. 볼록 사변형이라고 함 .

C++를 사용하여 주어진 점에서 가능한 사변형의 수 찾기

총 교차 수 =1

대각선이 교차하지 않으면 오목한 사각형이라고 하는 세 개의 가능한 사각형이 형성될 수 있습니다.

C++를 사용하여 주어진 점에서 가능한 사변형의 수 찾기

총 교차 수 =0

예시

#include <iostream>
using namespace std;
struct Point{ // points
    int x;
    int y;
};
int check_orientation(Point i, Point j, Point k){
    int val = (j.y - i.y) * (k.x - j.x) - (j.x - i.x) * (k.y - j.y);
    if (val == 0)
       return 0;
    return (val > 0) ? 1 : 2;
}
// checking whether line segments intersect
bool check_Intersect(Point A, Point B, Point C, Point D){
    int o1 = check_orientation(A, B, C);
    int o2 = check_orientation(A, B, D);
    int o3 = check_orientation(C, D, A);
    int o4 = check_orientation(C, D, B);
    if (o1 != o2 && o3 != o4)
       return true;
    return false;
}
// checking whether 2 points are same
bool check_similar(Point A, Point B){
   // If found similiar then we are returning false that means no quad. can be formed
    if (A.x == B.x && A.y == B.y)
       return false;
   // returning true for not found similiar
    return true;
}
// Checking collinearity of three points
bool check_collinear(Point A, Point B, Point C){
    int x1 = A.x, y1 = A.y;
    int x2 = B.x, y2 = B.y;
    int x3 = C.x, y3 = C.y;
    if ((y3 - y2) * (x2 - x1) == (y2 - y1) * (x3 - x2))
       return false;
    else
       return true;
}
// main function
int main(){
   struct Point A,B,C,D;
   A.x = -2, A.y = 8;// A(-2, 8)
   B.x = -2, B.y = 0;// B(-2, 0)
   C.x = 6, C.y = -1;// C(6, -1)
   D.x = 0, D.y = 8;// D(0, 8)
   // Checking whether any 3 points are collinear
   bool flag = true;
   flag = flag & check_collinear(A, B, C);
   flag = flag & check_collinear(A, B, D);
   flag = flag & check_collinear(A, C, D);
   flag = flag & check_collinear(B, C, D);
   // If points found collinear
   if (flag == false){
       cout << "Number of quadrilaterals possible from the given points: 0";
       return 0;
   }
   // Checking if 2 points are same.
   bool same = true;
   same = same & check_similar(A, B);
   same = same & check_similar(A, C);
   same = same & check_similar(B, D);
   same = same & check_similar(C, D);
   same = same & check_similar(A, D);
   same = same & check_similar(B, C);
   // If similiar point exist
   if (same == false){
       cout << "Number of quadrilaterals possible from the given points: 0";
   return 0;
   }
   // checking whether diagonal intersect or not
    flag = true;
   if (check_Intersect(A, B, C, D))
       flag = false;
   if (check_Intersect(A, C, B, D))
       flag = false;
   if (check_Intersect(A, B, D, C))
       flag = false;
   if (flag == true)
       cout << "Number of quadrilaterals possible from the given points: 3";
   else
       cout << "Number of quadrilaterals possible from the given points: 1";
   return 0;
}

출력

Number of quadrilaterals possible from the given points : 1

위 코드 설명

이 코드는 다음 단계에서 이해할 수 있습니다 -

  • 세 개의 점이 동일선상에 있는지 확인하고 그렇다면 쿼드의 수입니다. :0

  • 두 점이 유사한지 확인하고 유사하면 쿼드의 수입니다. :0

  • 선분의 교차 여부 확인:

    • 그렇다면 쿼드의 수입니다. :1

    • 아니오인 경우 쿼드의 수입니다. :3

결론

이 기사에서는 주어진 4개의 점으로 만들 수 있는 모든 가능한 사변형을 찾는 문제를 해결했습니다. 사변형의 수가 공선성, 교차 및 방향에 따라 어떻게 달라지는지 이해합니다. 우리는 또한 C++ 프로그램을 작성하는데 C, Java, python과 같은 다른 언어로 이 프로그램을 작성할 수 있습니다.