題目
在二維座標系中,所有的值都是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;
}
}