📜  位于矩形和三角形内的点数

📅  最后修改于: 2021-04-17 15:32:16             🧑  作者: Mango

给定两个二维数组angle [] []triangle [] [] ,分别代表矩形和三角形的顶点坐标,另一个数组points [] []N个坐标组成,任务是计算位于矩形和三角形内的点。

例子:

方法:可以根据以下观察结果解决给定问题:

因此,为了解决该问题,想法是检查给定点是否位于给定三角形内以及是否从矩形获得的四个三角形中的任何一个。 F>按照以下步骤解决问题:

  • 初始化四个列表,例如,三角形1,三角形2,三角形3三角形4 ,以存储可能来自矩形的四个三角形的顶点的坐标。
  • 通过一次考虑矩形的三个顶点来填充上述初始化列表。
  • 初始化一个变量,例如ans0 ,以存储三角形以及矩形内部的点数。
  • 遍历数组points [] []并检查是否存在任何四个位于获得的四个三角形之内以及给定三角形之内的点。如果发现为真,则将ans1
  • 完成上述步骤后,打印ans的值作为结果计数。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to calculate area of a triangle
int getArea(int x1,int y1,int x2,int y2,int x3,int y3)
{
   
    // Return the resultant area
    return abs((x1 * (y2 - y3) +
                x2 * (y3 - y1) +
                x3 * (y1 - y2)) / 2);
}
 
// Function to check if a point
// lies inside a triangle or not
int isInside(vector> triangle, vector point)
{
 
    vector A = triangle[0];
    vector B = triangle[1];
    vector C = triangle[2];
    int x = point[0];
    int y = point[1];
 
    // Calculate area of triangle ABC
    int ABC = getArea(A[0], A[1],
                B[0], B[1],
                C[0], C[1]);
 
    // Calculate area of triangle
    // formed by connecting B, C, point
    int BPC = getArea(x, y, B[0],
                B[1], C[0],
                C[1]);
 
    // Calculate area of triangle
    // formed by connecting A, C, point
    int APC = getArea(A[0], A[1], x,
                y, C[0], C[1]);
 
    // Calculate area of triangle
    // formed by connecting A, B, point
    int APB = getArea(A[0], A[1], B[0],
               B[1], x, y);
 
    // Check if the sum of the areas of
    // above three triangles the same as ABC
    return ABC == (APC + APB + BPC);
}
 
// Function to count the number of points
// lying inside a triangle & rectangle
void countPoints(vector> rectangle,vector> triangle,vector> points){
 
    // Stores the coordinates of the
    // vertices of the triangles
    int n = rectangle.size();
    vector> triangle1;
    for(int i = 1; i < n; i++) triangle1.push_back(rectangle[i]);
    vector> triangle2;
 
    for(int i = 0; i < 3; i++) triangle2.push_back(rectangle[i]);
    vector> triangle3;
 
    for(int i = 0; i < 2; i++) triangle3.push_back(rectangle[i]);
    triangle3.push_back(rectangle[3]);
    vector> triangle4;
 
    for(int i = n - 2; i < n; i++) triangle4.push_back(rectangle[i]);
 
    triangle4.push_back(rectangle[0]);
 
    // Stores the number of points lying
    // inside the triangle and rectangle
    int ans = 0;
 
    // Traverse the array of points
    for(auto point:points)
    {
 
        // Stores whether the current point
        // lies inside triangle1 or not
        int condOne = isInside(triangle1, point);
 
        // Stores whether the current point
        // lies inside triangle2 or not
        int condTwo = isInside(triangle2, point);
 
        // Stores whether the current point
        // lies inside triangle3 or not
        int condThree = isInside(triangle3, point);
 
        // Stores whether the current point
        // lies inside triangle4 or not
        int condFour = isInside(triangle4, point);
 
        // Stores whether the current point
        // lies inside given triangle or not
        int condFive = isInside(triangle, point);
 
        // If current point lies inside
        // given triangle as well as inside
        // any of the four obtained triangles
        if ((condOne || condTwo || condThree || condFour) && condFive)
            ans += 1;
        }
 
    // Print the count of points
    cout << ans;
}
 
// Driver Code
int main()
{
  vector> rectangle = {{6, 5}, {2, 2}, {2, 1}, {5, 5}};
  vector> points = {{1, 1}, {6, 1}, {6, 6}, {1, 6}};
  vector> triangle = {{4, 4}, {0, 4}, {0, -2}};
  countPoints(points, triangle, rectangle);
  return 0;
}
 
// This code is contributed by mohit kumar 29.


Java
// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG{
     
// Function to calculate area of a triangle
static int getArea(int x1, int y1, int x2,
                   int y2, int x3, int y3)
{
     
    // Return the resultant area
    return Math.abs((x1 * (y2 - y3) +
                     x2 * (y3 - y1) +
                     x3 * (y1 - y2)) / 2);
}
  
// Function to check if a point
// lies inside a triangle or not
static int isInside(ArrayList> triangle,
                    ArrayList point)
{
    ArrayList A = triangle.get(0);
    ArrayList B = triangle.get(1);
    ArrayList C = triangle.get(2);
    int x = point.get(0);
    int y = point.get(1);
  
    // Calculate area of triangle ABC
    int ABC = getArea(A.get(0), A.get(1),
                      B.get(0), B.get(1),
                      C.get(0), C.get(1));
  
    // Calculate area of triangle
    // formed by connecting B, C, point
    int BPC = getArea(x, y, B.get(0),
                  B.get(1), C.get(0),
                            C.get(1));
  
    // Calculate area of triangle
    // formed by connecting A, C, point
    int APC = getArea(A.get(0), A.get(1), x,
                   y, C.get(0), C.get(1));
  
    // Calculate area of triangle
    // formed by connecting A, B, point
    int APB = getArea(A.get(0), A.get(1), B.get(0),
                      B.get(1), x, y);
  
    // Check if the sum of the areas of
    // above three triangles the same as ABC
    return ABC == (APC + APB + BPC) ? 1 :0;
}
  
// Function to count the number of points
// lying inside a triangle & rectangle
static void countPoints(ArrayList> rectangle,
                        ArrayList> triangle,
                        ArrayList> points)
{
  
    // Stores the coordinates of the
    // vertices of the triangles
    int n = rectangle.size();
    ArrayList> triangle1 = new ArrayList>();
     
    for(int i = 1; i < n; i++)
        triangle1.add(rectangle.get(i));
         
    ArrayList> triangle2 = new ArrayList>();
  
    for(int i = 0; i < 3; i++)
    {
        triangle2.add(rectangle.get(i));
    }
    ArrayList> triangle3 = new ArrayList>();
  
    for(int i = 0; i < 2; i++)
    {
        triangle3.add(rectangle.get(i));
    }
    triangle3.add(rectangle.get(3));
    ArrayList> triangle4 = new ArrayList>();
  
    for(int i = n - 2; i < n; i++)
    {
        triangle4.add(rectangle.get(i));
    }
  
    triangle4.add(rectangle.get(0));
  
    // Stores the number of points lying
    // inside the triangle and rectangle
    int ans = 0;
  
    // Traverse the array of points
    for(ArrayList point:points)
    {
  
        // Stores whether the current point
        // lies inside triangle1 or not
        int condOne = isInside(triangle1, point);
  
        // Stores whether the current point
        // lies inside triangle2 or not
        int condTwo = isInside(triangle2, point);
  
        // Stores whether the current point
        // lies inside triangle3 or not
        int condThree = isInside(triangle3, point);
  
        // Stores whether the current point
        // lies inside triangle4 or not
        int condFour = isInside(triangle4, point);
  
        // Stores whether the current point
        // lies inside given triangle or not
        int condFive = isInside(triangle, point);
  
        // If current point lies inside
        // given triangle as well as inside
        // any of the four obtained triangles
        if ((condOne != 0 || condTwo != 0 ||
           condThree != 0 || condFour != 0) &&
            condFive != 0)
                ans += 1;
        }
  
    // Print the count of points
    System.out.println(ans);
}
  
// Driver Code
 
public static void main (String[] args)
{
    ArrayList> rectangle = new ArrayList>();
    ArrayList> points = new ArrayList>();
    ArrayList> triangle = new ArrayList>();
     
    rectangle.add(new ArrayList(Arrays.asList(6, 5)));
    rectangle.add(new ArrayList(Arrays.asList(2, 2)));
    rectangle.add(new ArrayList(Arrays.asList(2, 1)));
    rectangle.add(new ArrayList(Arrays.asList(5, 5)));
     
    points.add(new ArrayList(Arrays.asList(1, 1)));
    points.add(new ArrayList(Arrays.asList(6, 1)));
    points.add(new ArrayList(Arrays.asList(6, 6)));
    points.add(new ArrayList(Arrays.asList(1, 6)));
     
    triangle.add(new ArrayList(Arrays.asList(4, 4)));
    triangle.add(new ArrayList(Arrays.asList(0, 4)));
    triangle.add(new ArrayList(Arrays.asList(0, -2)));
     
    countPoints(points, triangle, rectangle);
}
}
 
// This code is contributed by avanitrachhadiya2155


Python3
# Python3 program for the above approach
 
# Function to calculate area of a triangle
def getArea(x1, y1, x2, y2, x3, y3):
 
    # Return the resultant area
    return abs((x1 * (y2 - y3) +
                x2 * (y3 - y1) +
                x3 * (y1 - y2)) / 2)
 
# Function to check if a point
# lies inside a triangle or not
def isInside(triangle, point):
 
    A, B, C = triangle
    x, y = point
 
    # Calculate area of triangle ABC
    ABC = getArea(A[0], A[1],
                B[0], B[1],
                C[0], C[1])
 
    # Calculate area of triangle
    # formed by connecting B, C, point
    BPC = getArea(x, y, B[0],
                B[1], C[0],
                C[1])
 
    # Calculate area of triangle
    # formed by connecting A, C, point
    APC = getArea(A[0], A[1], x,
                y, C[0], C[1])
 
    # Calculate area of triangle
    # formed by connecting A, B, point
    APB = getArea(A[0], A[1], B[0],
                B[1], x, y)
 
    # Check if the sum of the areas of
    # above three triangles the same as ABC
    return ABC == (APC + APB + BPC)
 
# Function to count the number of points
# lying inside a triangle & rectangle
def countPoints(rectangle, triangle, points):
 
    # Stores the coordinates of the
    # vertices of the triangles
    triangle1 = rectangle[1:]
     
    triangle2 = rectangle[:3]
     
    triangle3 = rectangle[:2]
    triangle3.append(rectangle[3])
     
    triangle4 = rectangle[-2:]
    triangle4.append(rectangle[0])
 
    # Stores the number of points lying
    # inside the triangle and rectangle
    ans = 0
 
    # Traverse the array of points
    for point in points:
     
        # Stores whether the current point
        # lies inside triangle1 or not
        condOne = isInside(triangle1, point)
         
        # Stores whether the current point
        # lies inside triangle2 or not
        condTwo = isInside(triangle2, point)
         
        # Stores whether the current point
        # lies inside triangle3 or not
        condThree = isInside(triangle3, point)
         
        # Stores whether the current point
        # lies inside triangle4 or not
        condFour = isInside(triangle4, point)
 
        # Stores whether the current point
        # lies inside given triangle or not
        condFive = isInside(triangle, point)
 
        # If current point lies inside
        # given triangle as well as inside
        # any of the four obtained triangles
        if (condOne or condTwo or condThree \
            or condFour) and condFive:
            ans += 1
             
    # Print the count of points
    print(ans)
 
 
# Driver Code
 
rectangle = [[6, 5], [2, 2], [2, 1], [5, 5]]
points = [[1, 1], [6, 1], [6, 6], [1, 6]]
triangle = [[4, 4], [0, 4], [0, -2]]
 
countPoints(points, triangle, rectangle)


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
public class GFG
{
 
  // Function to calculate area of a triangle
  static int getArea(int x1, int y1, int x2,
                     int y2, int x3, int y3)
  {
 
    // Return the resultant area
    return Math.Abs((x1 * (y2 - y3) +
                     x2 * (y3 - y1) +
                     x3 * (y1 - y2)) / 2);
  }
 
  // Function to check if a point
  // lies inside a triangle or not
  static int isInside(List> triangle,
                      List point)
  {
    List A = triangle[0];
    List B = triangle[1];
    List C = triangle[2];
    int x = point[0];
    int y = point[1];
 
    // Calculate area of triangle ABC
    int ABC = getArea(A[0], A[1],
                      B[0], B[1],
                      C[0], C[1]);
 
    // Calculate area of triangle
    // formed by connecting B, C, point
    int BPC = getArea(x, y, B[0],
                      B[1], C[0],
                      C[1]);
 
    // Calculate area of triangle
    // formed by connecting A, C, point
    int APC = getArea(A[0], A[1], x,
                      y, C[0], C[1]);
 
    // Calculate area of triangle
    // formed by connecting A, B, point
    int APB = getArea(A[0], A[1], B[0],
                      B[1], x, y);
 
    // Check if the sum of the areas of
    // above three triangles the same as ABC
    return ABC == (APC + APB + BPC) ? 1 :0;
  }
 
  // Function to count the number of points
  // lying inside a triangle & rectangle
  static void countPoints(List> rectangle,
                          List> triangle,
                          List> points)
  {
 
    // Stores the coordinates of the
    // vertices of the triangles
    int n = rectangle.Count;
    List> triangle1 = new List>();
    for(int i = 1; i < n; i++)
      triangle1.Add(rectangle[i]);
    List> triangle2 = new List>();
    for(int i = 0; i < 3; i++)
    {
      triangle2.Add(rectangle[i]);
    }
    List> triangle3 = new List>();
 
    for(int i = 0; i < 2; i++)
    {
      triangle3.Add(rectangle[i]);
    }
    triangle3.Add(rectangle[3]);
    List> triangle4 = new List>();
 
    for(int i = n - 2; i < n; i++)
    {
      triangle4.Add(rectangle[i]);
    }
 
    triangle4.Add(rectangle[0]);
 
    // Stores the number of points lying
    // inside the triangle and rectangle
    int ans = 0;
 
    // Traverse the array of points
    foreach(List point in points)
    {
 
      // Stores whether the current point
      // lies inside triangle1 or not
      int condOne = isInside(triangle1, point);
 
      // Stores whether the current point
      // lies inside triangle2 or not
      int condTwo = isInside(triangle2, point);
 
      // Stores whether the current point
      // lies inside triangle3 or not
      int condThree = isInside(triangle3, point);
 
      // Stores whether the current point
      // lies inside triangle4 or not
      int condFour = isInside(triangle4, point);
 
      // Stores whether the current point
      // lies inside given triangle or not
      int condFive = isInside(triangle, point);
 
      // If current point lies inside
      // given triangle as well as inside
      // any of the four obtained triangles
      if ((condOne != 0 || condTwo != 0 ||
           condThree != 0 || condFour != 0) &&
          condFive != 0)
        ans += 1;
    }
 
    // Print the count of points
    Console.WriteLine(ans);
  }
 
  // Driver Code
  static public void Main ()
  {
    List> rectangle = new List>();
    List> points = new List>();
    List> triangle = new List>();
 
    rectangle.Add(new List(){6, 5});
    rectangle.Add(new List(){2, 2});
    rectangle.Add(new List(){2, 1});
    rectangle.Add(new List(){5, 5});
 
    points.Add(new List(){1, 1});
    points.Add(new List(){6, 1});
    points.Add(new List(){6, 6});
    points.Add(new List(){1, 6});
 
    triangle.Add(new List(){4, 4});
    triangle.Add(new List(){0, 4});
    triangle.Add(new List(){0, -2});
 
    countPoints(points, triangle, rectangle);
  }
}
 
// This code is contributed by rag2127


输出:
2

时间复杂度: O(N)
辅助空间: O(1)