给定一个矩形的四个点,再给定一个点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