经典问题:如何判断一个点是否在三角形内?

在二维坐标系中,所有的值都是double类型,那么一个三角形可以由3个点来代表,给定3个点代表的三角形,再给定一个点(x, y),判断(x, y)是否在三角形中
输入描述:
输入有四行,每行两个浮点数。

前三行的6个数分别代表三角形的三个顶点的坐标

最后两个数分别表示(x, y)
输出描述:
若(x, y)在三角形中,输出"Yes"

否则输出"No"

思路:

计算点o与三角形三个点分别形成的三角形面积,判断和是否为三角形的面积。使用海伦公式,但由于double有精度误差,所以该方法无法100ac

 

 

public class Main {
    
    public static class Point
    {
        public double x,y;
        public Point(double x,double y)
        {
            this.x = x;
            this.y = y;
        }
    }
    //计算两点之间的距离
    public static double getDist(Point p1,Point p2)
    {
        return Math.sqrt( Math.pow( p1.x-p2.x , 2) + Math.pow(p1.y-p2.y, 2) );
    }
    //计算三角形的面积
    public static double getArea(Point p1,Point p2,Point p3)
    {
        double a = getDist(p1, p2);
        double b = getDist(p2, p3);
        double c = getDist(p1, p3);
        double p = (a+b+c)/2;
        return Math.sqrt( p*(p-a)*(p-b)*(p-c)  );
    }
    public static boolean isInArea(Point p1,Point p2,Point p3,Point o)
    {
        double s1 = getArea(p1, p2, o);
        double s2 = getArea(p2, p3, o);
        double s3 = getArea(p3, p2, o);
        double s = getArea(p1, p2, p3);
        return s1+s2+s3==s;
    }
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        Point p1 = new Point(scanner.nextDouble(), scanner.nextDouble());
        Point p2 = new Point(scanner.nextDouble(), scanner.nextDouble());
        Point p3 = new Point(scanner.nextDouble(), scanner.nextDouble());
        Point o = new Point(scanner.nextDouble(), scanner.nextDouble());
        System.out.println( isInArea(p1, p2, p3, o)==true?"Yes":"No" );
    }
}

 

posted @ 2021-03-29 09:10  γGama  阅读(808)  评论(0编辑  收藏  举报