主要使用向量外积来判断点是否在三角形内部
- 点乘 – a·b=|a|·|b|cos<a,b>用来判断两个向量的方向是否相同(90度范围内) —结果为数值
- 叉乘 – a·b=|a|·|b|sin<a,b>用来判断两个是否同侧(顺逆时针)–结果为向量
function inTriangle(x1, y1, x2, y2, x3, y3, x, y) {
let s1 = computeArea(x1, y1, x2, y2, x, y) / 2;
let s2 = computeArea(x2, y2, x3, y3, x, y) / 2;
let s3 = computeArea(x1, y1, x3, y3, x, y) / 2;
let s = computeArea(x1, y1, x2, y2, x3, y3);
if (s1 + s2 + s3 == s) {
return true;
}
return false;
}
function computeArea(x1, y1, x2, y2, x, y) {
return ((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y));
}
function inTriangle2(x1, y1, x2, y2, x3, y3, x, y) {
let f1 = (x3 - x1) * (y3 - y2) - (x3 - x2) * (y3 - y1);
let f2 = (x3 - x) * (y3 - y2) - (x3 - x2) * (y3 - y);
let f3 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
let f4 = (x3 - x1) * (y1 - y) - (x1 - x) * (y3 - y1);
let f5 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
let f6 = (x2 - x1) * (y2 - y) - (x2 - x) * (y2 - y1);
if ((f1 > 0 && f2 > 0) || (f1 < 0 && f2 < 0)) {
if ((f3 > 0 && f4 > 0) || (f3 < 0 && f4 < 0)) {
if ((f5 > 0 && f6 > 0) || (f5 < 0 && f6 < 0)) {
return true;
}
}
}
return false;
}
function inTriangle3(x1, y1, x2, y2, x3, y3, x, y) {
let f1 = (x1-x) * (y2-y) - (x2-x) * (y1-y)
let f2 = (x2-x) * (y3-y) - (x3-x) * (y2-y)
let f3 = (x1-x) * (y3-y) - (x3-x) * (y1-y)
return f1 * f2 >= 0 && f1 * f3 >= 0;
}