题目描述
在二维坐标系中,所有的值都是double类型,那么一个三角形可以由3个点来代表,给定3个点代表的三角形,再给定一个点(x, y),判断(x, y)是否在三角形中
输入描述:
输入有四行,每行两个浮点数。
前三行的6个数分别代表三角形的三个顶点的坐标
最后两个数分别表示(x, y)
输出描述:
若(x, y)在三角形中,输出"Yes"
否则输出"No"
示例1
输入
-1.00 0.00
1.50 3.50
2.73 -3.12
1.23 0.23
输出
Yes
解法一:存在误判的
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] ss = br.readLine().trim().split(" ");
double x1 = Double.parseDouble(ss[0]);
double y1 = Double.parseDouble(ss[1]);
ss = br.readLine().trim().split(" ");
double x2 = Double.parseDouble(ss[0]);
double y2 = Double.parseDouble(ss[1]);
ss = br.readLine().trim().split(" ");
double x3 = Double.parseDouble(ss[0]);
double y3 = Double.parseDouble(ss[1]);
ss = br.readLine().trim().split(" ");
double x = Double.parseDouble(ss[0]);
double y = Double.parseDouble(ss[1]);
double sum = getArea(x1,y1,x2,y2,x3,y3);
double a = getArea(x1,y1,x2,y2,x,y);
double b = getArea(x1,y1,x3,y3,x,y);
double c = getArea(x2,y2,x3,y3,x,y);
if(sum==(a+b+c)){
System.out.print("Yes");
}else{
System.out.print("No");
}
}
public static double getArea(double x1,double y1,double x2,double y2,double x3,double y3){
double l1 = len(x1,y1,x2,y2);
double l2 = len(x1,y1,x3,y3);
double l3 = len(x2,y2,x3,y3);
double p = (l1+l2+l3)/2;
return Math.sqrt(p*(p-l1)*(p-l2)*(p-l3));
}
public static double len(double x1,double y1,double x2,double y2){
return Math.sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
}
}
解法二:利用向量积
思路:右手法则 x1 * y2-x2 * y1
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] ss = br.readLine().trim().split(" ");
double x1 = Double.parseDouble(ss[0]);
double y1 = Double.parseDouble(ss[1]);
ss = br.readLine().trim().split(" ");
double x2 = Double.parseDouble(ss[0]);
double y2 = Double.parseDouble(ss[1]);
ss = br.readLine().trim().split(" ");
double x3 = Double.parseDouble(ss[0]);
double y3 = Double.parseDouble(ss[1]);
ss = br.readLine().trim().split(" ");
double x = Double.parseDouble(ss[0]);
double y = Double.parseDouble(ss[1]);
boolean result = judge(x1,y1,x2,y2,x3,y3,x,y);
if(result==true){
System.out.print("Yes");
}else{
System.out.print("No");
}
}
public static boolean judge(double x1,double y1,double x2,double y2,double x3,double y3,double x,double y){
if(crossProduct(x3-x1,y3-y1,x2-x1,y2-y1)>=0){
double tmpx = x2;
double tmpy = y2;
x2 = x3;
y2 = y3;
y3 = tmpx;
x3 = tmpy;
}
if(crossProduct(x2-x1,y2-y1,x-x1,y-y1)<0){
return false;
}
if(crossProduct(x3-x2,y3-y2,x-x2,y-y2)<0){
return false;
}
if(crossProduct(x1-x3,y1-y3,x-x3,y-y3)<0){
return false;
}
return true;
}
public static double crossProduct(double x1,double y1,double x2,double y2){
return x1*y2-x2*y1;
}
}