虽然它是一种幼稚的方法,但我尝试了以下概念:
如果Point (px,py) 在给定矩形内,则通过连接 2 个矩形点和给定点(例如逆时针或顺时针方向)形成的三角形面积之和将等于矩形的总和。
我有一张相同的图片,但由于声誉低(因为我是新手),无法发布。
当我将这个公式化为实际的 Java 代码时,我不得不处理这样一种情况:
小数部分有 15 个 9 的面积值被四舍五入到最接近的整数。
参考此代码:
import static java.lang.Math.sqrt;
public class PointInsideRect
{
private static double square(double n)
{
return n*n;
}
private static double areaOfTriangle(
int xa, int ya,
int xb, int yb,
int px, int py )
{
double side1 = sqrt(square(ya-yb) + square(xa-xb));
double side2 = sqrt(square(ya-py) + square(xa-px));
double side3 = sqrt(square(yb-py) + square(xb-px));
double semi_perimeter = (side1 + side2 + side3) / 2;
return sqrt(semi_perimeter
* ( semi_perimeter - side1 )
* ( semi_perimeter - side2 )
* ( semi_perimeter - side3 ));
}
private static double areaOfRect(
int x1, int y1,
int x2, int y2,
int x3, int y3,
int x4, int y4 )
{
double side1 = sqrt(square(y1-y2) + square(x1-x2));
double side2 = sqrt(square(y2-y3) + square(x2-x3));
return side1 * side2;
}
public boolean check(
int x1, int y1,
int x2, int y2,
int x3, int y3,
int x4, int y4,
int pointX, int pointY)
{
double tri1Area = areaOfTriangle(x1,y1, x2,y2, pointX,pointY);
double tri2Area = areaOfTriangle(x2,y2, x3,y3, pointX,pointY);
double tri3Area = areaOfTriangle(x3,y3, x4,y4, pointX,pointY);
double tri4Area = areaOfTriangle(x4,y4, x1,y1, pointX,pointY);
double rectArea = areaOfRect(x1,y1, x2,y2, x3,y3, x4,y4);
double triAreaSum = tri1Area + tri2Area + tri3Area+ tri4Area;
if(triAreaSum % Math.pow(10, 14) >= 0.999999999999999)
{
triAreaSum = Math.ceil(triAreaSum);
System.out.println(triangleAreaSum);
}
return triAreaSum == rectArea;
}
public static void main(String[] args)
{
PointInsideRect inRect = new PointInsideRect();
System.out.println(inRect.check(1,1, 1,3, 3,3, 3,1, 2,2));
}
}