checking if a point is inside a specified Rectangle

前端 未结 4 1095
既然无缘
既然无缘 2020-12-11 16:41

ok, so i\'m doing an assignment for a Java class and one part of the assignment is to find out if a point is within the dimensions of a rectangle. so I created this code:

4条回答
  •  佛祖请我去吃肉
    2020-12-11 17:16

    Though its a naive method, I tried the following concept:

    If the Point (px,py) is inside the given rectangle, the sum of areas of triangles formed by joining 2 rectangle points and the given point (say in anti-clockwise or clockwise direction) would be equal to the sum of rectangle.

    I have a picture for the same, but due to low reputation (as I am a newbie), cannot post it.

    When I was formulating this into actual Java code, I had to handle a situation where the area value with decimal part having 15 9s was rounded to its nearest integer.

    Refer this code:

    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));
        }
    }
    

提交回复
热议问题