我只发现三角形中“命中测试”的算法和实现,如下所示:http ://www.emanueleferonato.com/2012/06/18/algorithm-to-determine-if-a-point-is-inside-a -triangle-with-mathematics-no-hit-test-involved/,这个: http: //www.blackpawn.com/texts/pointinpoly/default.html
但在我工作的项目中,我发现了这段代码:
public static function pointInTriangle($x, $y, $x1, $y1, $x2, $y2, $x3, $y3)
{
return self::side($x, $y, $x1, $y1, $x2, $y2, $x3, $y3) &&
self::side($x, $y, $x1, $y1, $x3, $y3, $x2, $y2) &&
self::side($x, $y, $x3, $y3, $x2, $y2, $x1, $y1);
}
private static function side($x, $y, $x1, $y1, $x2, $y2, $x3, $y3)
{
if ($x1 - $x2 != 0) {
$k = ($y1 - $y2) / ($x1 - $x2);
$s1 = $y3 - $y1 - $k * ($x3 - $x1);
$s2 = $y - $y1 - $k * ($x - $x1);
}
else {
$s1 = $x3 - $x1;
$s2 = $x - $x1;
}
return ($s1 * $s2) >= 0;
}
你能向我解释一下这是如何工作的吗?为什么我们需要计算 $k(这是 x1, y1 和 x2, y2 点之间的斜率,不是吗?)?
我在理解第一个子句时遇到问题。为什么我们需要从 y3 和多个 k 中减去例如 y1 来得到 x3 和 x1 的减法结果?这个操作会做什么?$k * ($x3 - $x1) 是什么?$k 是点 $x1,$y1 和 $x2,$y2 之间的斜率,而不是 $x1,$y1 和 $x3,$y3 之间的斜率。
我有一些代数几何的知识。换句话说,如果主公式(直线方程)是 y = kx + b,对于点 (x1, y1) 和 (x2, y2),然后 f(x3, y3) = y3 - y1 - (y2 - y1) / (x2 - x1) * (x3 - x1)?
我对吗?