经典问题:如何判断一个点是否在三角形内?
在二维坐标系中,所有的值都是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" );
}
}