📌  相关文章
📜  检查给定点是否在矩形内

📅  最后修改于: 2021-04-27 06:12:46             🧑  作者: Mango

给定一个矩形的四个点,再给定一个点P。编写一个函数检查P是否位于给定的矩形内。
例子:

Input : R = [(10, 10), (10, -10), 
             (-10, -10), (-10, 10)]
        P = (0, 0)
Output : yes
Illustration : 

Input : R = [(10, 10), (10, -10),
             (-10, -10), (-10, 10)],
        P = (20, 20)
Output : no
Illustration :
 

先决条件:检查给定点是否在三角形内
方法:设四个角的坐标为A(x1,y1),B(x2,y2),C(x3,y3)和D(x4,y4)。给定点P的坐标为(x,y)
1)计算给定矩形的面积,即矩形ABCD的面积为三角形ABC的面积+三角形ACD的面积。
面积A = [x1(y2 – y3)+ x2(y3 – y1)+ x3(y1-y2)] / 2 + [x1(y4 – y3)+ x4(y3 – y1)+ x3(y1-y4)] / 2
2)计算三角形PAB的面积为A1。
3)计算三角形PBC的面积为A2。
4)计算三角形PCD的面积为A3。
5)计算三角形PAD的面积为A4。
6)如果P位于三角形内,则A1 + A2 + A3 + A4必须等于A。

C++
#include 
using namespace std;
 
/* A utility function to calculate area of
   triangle formed by (x1, y1), (x2, y2) and
  (x3, y3) */
float area(int x1, int y1, int x2, int y2,
                            int x3, int y3)
{
    return abs((x1 * (y2 - y3) + x2 * (y3 - y1) +
                x3 * (y1 - y2)) / 2.0);
}
 
/* A function to check whether point P(x, y)
   lies inside the rectangle formed by A(x1, y1),
   B(x2, y2), C(x3, y3) and D(x4, y4) */
bool check(int x1, int y1, int x2, int y2, int x3,
             int y3, int x4, int y4, int x, int y)
{
    /* Calculate area of rectangle ABCD */
    float A = area(x1, y1, x2, y2, x3, y3) +
              area(x1, y1, x4, y4, x3, y3);
 
    /* Calculate area of triangle PAB */
    float A1 = area(x, y, x1, y1, x2, y2);
 
    /* Calculate area of triangle PBC */
    float A2 = area(x, y, x2, y2, x3, y3);
 
    /* Calculate area of triangle PCD */
    float A3 = area(x, y, x3, y3, x4, y4);
 
    /* Calculate area of triangle PAD */
    float A4 = area(x, y, x1, y1, x4, y4);
 
    /* Check if sum of A1, A2, A3 and A4
       is same as A */
    return (A == A1 + A2 + A3 + A4);
}
 
/* Driver program to test above function */
int main()
{
    /* Let us check whether the point P(10, 15)
      lies inside the rectangle formed by A(0, 10),
      B(10, 0) C(0, -10) D(-10, 0) */
    if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
        cout << "yes";
    else
        cout << "no";
    return 0;
}


Java
class GFG
{
    /* A utility function to calculate area of
    triangle formed by (x1, y1), (x2, y2) and
    (x3, y3) */
    static float area(int x1, int y1, int x2,
                        int y2, int x3, int y3)
    {
        return (float)Math.abs((x1 * (y2 - y3) +
        x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
    }
         
    /* A function to check whether point P(x, y)
    lies inside the rectangle formed by A(x1, y1),
    B(x2, y2), C(x3, y3) and D(x4, y4) */
    static boolean check(int x1, int y1, int x2, int y2,
    int x3, int y3, int x4, int y4, int x, int y)
    {
         
        /* Calculate area of rectangle ABCD */
        float A = area(x1, y1, x2, y2, x3, y3)+
                area(x1, y1, x4, y4, x3, y3);
     
        /* Calculate area of triangle PAB */
        float A1 = area(x, y, x1, y1, x2, y2);
     
        /* Calculate area of triangle PBC */
        float A2 = area(x, y, x2, y2, x3, y3);
     
        /* Calculate area of triangle PCD */
        float A3 = area(x, y, x3, y3, x4, y4);
     
        /* Calculate area of triangle PAD */
        float A4 = area(x, y, x1, y1, x4, y4);
     
        /* Check if sum of A1, A2, A3 and A4
        is same as A */
        return (A == A1 + A2 + A3 + A4);
    }
     
    // Driver code
    public static void main (String[] args)
    {
         
        /* Let us check whether the point P(10, 15)
        lies inside the rectangle formed by A(0, 10),
        B(10, 0) C(0, -10) D(-10, 0) */
        if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
            System.out.print("yes");
        else
            System.out.print("no");
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# A utility function to calculate
# area of triangle formed by (x1, y1),
# (x2, y2) and (x3, y3)
def area(x1, y1, x2, y2, x3, y3):
     
    return abs((x1 * (y2 - y3) +
                x2 * (y3 - y1) +
                x3 * (y1 - y2)) / 2.0)
 
# A function to check whether point
# P(x, y) lies inside the rectangle
# formed by A(x1, y1), B(x2, y2),
# C(x3, y3) and D(x4, y4)
def check(x1, y1, x2, y2, x3,
          y3, x4, y4, x, y):
               
    # Calculate area of rectangle ABCD
    A = (area(x1, y1, x2, y2, x3, y3) +
         area(x1, y1, x4, y4, x3, y3))
 
    # Calculate area of triangle PAB
    A1 = area(x, y, x1, y1, x2, y2)
 
    # Calculate area of triangle PBC
    A2 = area(x, y, x2, y2, x3, y3)
 
    # Calculate area of triangle PCD
    A3 = area(x, y, x3, y3, x4, y4)
 
    # Calculate area of triangle PAD
    A4 = area(x, y, x1, y1, x4, y4);
 
    # Check if sum of A1, A2, A3
    # and A4 is same as A
    return (A == A1 + A2 + A3 + A4)
 
# Driver Code
if __name__ == '__main__':
     
    # Let us check whether the point
    # P(10, 15) lies inside the
    # rectangle formed by A(0, 10),
    # B(10, 0) C(0, -10) D(-10, 0)
    if (check(0, 10, 10, 0, 0, -10,
                    -10, 0, 10, 15)):
        print("yes")
    else:
        print("no")
 
# This code is contributed by
# Surendra_Gangwar


C#
// C# program to Check whether a given
// point lies inside a rectangle or not
using System;
 
class GFG {
     
    // A utility function to calculate area
    // of triangle formed by (x1, y1),
    // (x2, y2) and (x3, y3)
    static float area(int x1, int y1, int x2,
                      int y2, int x3, int y3)
    {
        return (float)Math.Abs((x1 * (y2 - y3) +
                                x2 * (y3 - y1) +
                                x3 * (y1 - y2)) / 2.0);
    }
         
    // A function to check whether point P(x, y)
    // lies inside the rectangle formed by A(x1, y1),
    // B(x2, y2), C(x3, y3) and D(x4, y4)
    static bool check(int x1, int y1, int x2,
                      int y2, int x3, int y3,
                   int x4, int y4, int x, int y)
    {
         
        // Calculate area of rectangle ABCD
        float A = area(x1, y1, x2, y2, x3, y3) +
                  area(x1, y1, x4, y4, x3, y3);
     
        // Calculate area of triangle PAB
        float A1 = area(x, y, x1, y1, x2, y2);
     
        // Calculate area of triangle PBC
        float A2 = area(x, y, x2, y2, x3, y3);
     
        // Calculate area of triangle PCD
        float A3 = area(x, y, x3, y3, x4, y4);
     
        // Calculate area of triangle PAD
        float A4 = area(x, y, x1, y1, x4, y4);
     
        // Check if sum of A1, A2, A3 
        // and A4is same as A
        return (A == A1 + A2 + A3 + A4);
    }
     
    // Driver code
    public static void Main ()
    {
         
        // Let us check whether the point
        // P(10, 15) lies inside the rectangle
        // formed by A(0, 10), B(10, 0),
        // C(0, -10), D(-10, 0)
        if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
            Console.Write("yes");
        else
            Console.Write("no");
    }
}
 
// This code is contributed by Nitin Mittal.


PHP


Javascript


输出:

no