题目
在二维坐标系中,所有的值都是double类型,那么一个三角形可以由3个点来代笔,给定3个点代表的三角形,在给定一个点(x,y),判断(x,y)是否在三角形中。
问题分析
1.根据面积求解
如果O点在三角形内部,则面积ABC=面积ABO+面积BCO+面积CAO
如果O点在三角形外部,则面积ABC<面积ABO+面积BCO+面积CAO
2.逆时针绕三角形走一圈,如果O点在三角形内部,则O始终在走过边的左侧。判断一个点在一条有向边的左边还是右边,用向量的叉乘公式求解即可。
JAVA代码实现
package otherquestions;
public class IsInsideTriangle1209 {
/**
* 判断两个数的叉乘
* @param x1
* @param y1
* @param x2
* @param y2
* @return
*/
public double crossProduct(double x1, double y1, double x2, double y2) {
return x1 * y2 - x2 * y1;
}
public boolean isInsideTrian(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;
x3 = tmpx;
y3 = tmpy;
}
//如果有向边1->2叉乘1->3的结果为正,说明2在有向边的1->3的左边
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;
}
}