闲话不多说, 自己画个图形, 判断一下它们之间的规律, 其实比较容易写出来.
当前有两种方法:
方法一: 判断点P, 如果在三角形内, 则三角形的每个点和P点必在对应三角形边长的同一侧. 根据这个 "点" 同一侧判断.代码如下:
package sdkdemo.demo.com.lib.method;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sjx on 2020/9/9
*/
public class TriangleArea {
public void solution() {
List<List<Integer>> list = new ArrayList<>();
List<Integer> oneList = new ArrayList<>();
List<Integer> twoList = new ArrayList<>();
List<Integer> threeList = new ArrayList<>();
oneList.add(0);
oneList.add(0);
twoList.add(2);
twoList.add(0);
threeList.add(1);
threeList.add(2);
list.add(oneList);
list.add(twoList);
list.add(threeList);
int[] point = new int[]{1, 1};
String str = castMagic(list, point);
System.out.println("castMagic : " + str);
}
/**
* [[0,0],[2,0],[1,2]]
* [1,1]
*
* @param list
* @param point
* @return
*/
public String castMagic(List<List<Integer>> list, int[] point) {
List<Integer> oneList = list.get(0);
List<Integer> twoList = list.get(1);
List<Integer> threeList = list.get(2);
int aX = oneList.get(0);
int aY = oneList.get(1);
int bX = twoList.get(0);
int bY = twoList.get(1);
int cX = threeList.get(0);
int cY = threeList.get(1);
int pointX = point[0];
int pointY = point[1];
float abRate = (float) (1.0 * (aY - bY) / (aX - bX));
float abDex = aY - aX * abRate;
float acRate = (float) (1.0 * (aY - cY) / (aX - cX));
float acDex = aY - aX * acRate;
float bcRate = (float) (1.0 * (bY - cY) / (bX - cX));
float bcDex = bY - bX * bcRate;
float abPointY = pointX * abRate + abDex;
float acPointY = pointX * acRate + acDex;
float bcPointY = pointX * bcRate + bcDex;
float cTempY = cX * abRate + abDex;
float bTempY = bX * acRate + acDex;
float aTempY = aX * bcRate + bcDex;
if ((pointY - abPointY) * (cY - cTempY) >= 0
&& (pointY - acPointY) * (bY - bTempY) >= 0
&& (pointY - bcPointY) * (aY - aTempY) >= 0) {
return "YES";
}else{
return "NO";
}
}
}
方法二:
根据面积; 点P到三角形各个点之间, 组成包含P点的三角形面积之和, 与原有三角形面积的比较. 注意: 由于计算出来的是浮点型数值, 没发用 "==" 直接比较. 那就只好取精度, 比如两个面积之差小于 0.000000001这种, 甚至0.00000...1
package sdkdemo.demo.com.lib.method;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sjx on 2020/9/9
*/
public class TriangleAreaPoint {
public void solution() {
List<List<Integer>> list = new ArrayList<>();
List<Integer> oneList = new ArrayList<>();
List<Integer> twoList = new ArrayList<>();
List<Integer> threeList = new ArrayList<>();
oneList.add(0);
oneList.add(0);
twoList.add(2);
twoList.add(0);
threeList.add(1);
threeList.add(2);
list.add(oneList);
list.add(twoList);
list.add(threeList);
int[] point = new int[]{1, 1};
String str = castMagic(list, point);
System.out.println("castMagic : " + str);
}
/**
* [[0,0],[2,0],[1,2]]
* [1,1]
*
* @param list
* @param point
* @return
*/
public String castMagic(List<List<Integer>> list, int[] point) {
List<Integer> oneList = list.get(0);
List<Integer> twoList = list.get(1);
List<Integer> threeList = list.get(2);
int aX = oneList.get(0);
int aY = oneList.get(1);
int bX = twoList.get(0);
int bY = twoList.get(1);
int cX = threeList.get(0);
int cY = threeList.get(1);
int pointX = point[0];
int pointY = point[1];
List<Integer> pList = new ArrayList<>();
pList.add(pointX);
pList.add(pointY);
double ab = getSideLength(oneList, twoList);
double ac = getSideLength(oneList, threeList);
double bc = getSideLength(twoList, threeList);
double pa = getSideLength(pList, oneList);
double pb = getSideLength(pList, twoList);
double pc = getSideLength(pList, threeList);
double area = getArea(ab, ac, bc);
double p1 = getArea(pa, pb, ab);
double p2 = getArea(pa, pc, ac);
double p3 = getArea(pc, pb, bc);
if (Math.abs(area - p1 - p2 - p3) < 0.000000001){
return "YES";
}
return "NO";
}
private double getArea(double a, double b, double c) {
double perimeterHalf = (a + b + c) / 2;
double area = Math.sqrt(perimeterHalf * (perimeterHalf - a) * (perimeterHalf - b) * (perimeterHalf - c));
return area;
}
private double getSideLength(List<Integer> aList, List<Integer> bList) {
int aX = aList.get(0);
int aY = aList.get(1);
int bX = bList.get(0);
int bY = bList.get(1);
double sqrt = Math.sqrt(Math.pow(aX - bX, 2) + Math.pow(aY - bY, 2));
return sqrt;
}
}
个人感觉, 还是计算面积这种判断起来比较简单. 同一侧点的判断真心比较麻烦....