Php 三角形内点解释
我只找到了三角形中命中测试的算法和实现,如:,和: 但在我工作的项目中,我发现了以下代码:Php 三角形内点解释,php,algorithm,math,geometry,Php,Algorithm,Math,Geometry,我只找到了三角形中命中测试的算法和实现,如:,和: 但在我工作的项目中,我发现了以下代码: 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, $
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中减去y1,并将k乘以x3和x1的减法结果?这个手术怎么办?什么是$k*$x3-$x1$k是点$x1、$y1和$x2、$y2之间的斜率,而不是$x1、$y1和$x3、$y3之间的斜率
我有一些代数几何知识。换句话说,如果直线的主公式方程是y=kx+b,那么对于点x1,y1和x2,y2,我们有0=y-y1-y2-y1/x2-x1*x-x1,然后是fx3,y3=y3-y1-y2-y1/x2-x1*x3-x1
我说的对吗?功能侧回答问题的是点x1和x2形成的直线同一侧的点x和x3。如果x3的所有三个选项的答案都是肯定的,则点x位于三角形内
side的实现有点笨拙。请看第一条:
if ($x1 - $x2 != 0) {
$k = ($y1 - $y2) / ($x1 - $x2);
$s1 = $y3 - $y1 - $k * ($x3 - $x1);
$s2 = $y - $y1 - $k * ($x - $x1);
}
是,$k是直线从x1到x2的斜率$s1和$s2分别是该线上方x3点和x点的高度
请看第二条:
else {
$s1 = $x3 - $x1;
$s2 = $x - $x1;
}
这里,$s1和$s2有不同的含义。它们是两点到垂直线右侧的距离
无论哪种方式,这都是:
return ($s1 * $s2) >= 0;
给出正确答案。如果一条直线几乎是垂直的,你会遇到麻烦——如果你熟悉向量代数,有一种更干净、更安全的方法
编辑:
让我们重写第一条中的一行:
if ($x1 - $x2 != 0) {
$k = ($y1 - $y2) / ($x1 - $x2);
$s1 = $y3 - $y1 - $k * ($x3 - $x1);
$s2 = $y - $y1 - $k * ($x - $x1);
}
$s1=$y3-$y1-$k*$x3-$x1;
$s1=$y3-$k*$x3-$x1-$y1;
$s1=$y3-$k*$x3-$x1+$y1
粗体部分是点x3正下方或正上方直线上点的y坐标。因此,$s1是x3在该点上方或下方的高度。函数侧回答问题的是位于由点x1和x2构成的直线同一侧的点x和x3。如果x3的所有三个选项的答案都是肯定的,则点x位于三角形内
side的实现有点笨拙。请看第一条:
if ($x1 - $x2 != 0) {
$k = ($y1 - $y2) / ($x1 - $x2);
$s1 = $y3 - $y1 - $k * ($x3 - $x1);
$s2 = $y - $y1 - $k * ($x - $x1);
}
是,$k是直线从x1到x2的斜率$s1和$s2分别是该线上方x3点和x点的高度
请看第二条:
else {
$s1 = $x3 - $x1;
$s2 = $x - $x1;
}
这里,$s1和$s2有不同的含义。它们是两点到垂直线右侧的距离
无论哪种方式,这都是:
return ($s1 * $s2) >= 0;
给出正确答案。如果一条直线几乎是垂直的,你会遇到麻烦——如果你熟悉向量代数,有一种更干净、更安全的方法
编辑:
让我们重写第一条中的一行:
if ($x1 - $x2 != 0) {
$k = ($y1 - $y2) / ($x1 - $x2);
$s1 = $y3 - $y1 - $k * ($x3 - $x1);
$s2 = $y - $y1 - $k * ($x - $x1);
}
$s1=$y3-$y1-$k*$x3-$x1;
$s1=$y3-$k*$x3-$x1-$y1;
$s1=$y3-$k*$x3-$x1+$y1
粗体部分是点x3正下方或正上方直线上点的y坐标。因此,$s1是x3高于或低于该点的高度。$k*$x3-$x1是线从$x1上升到$x3的高度。如果不学习代数几何的基础知识,就无法理解这一点。。。描述线路;我对第二个f?没有太多的理解。我知道这无助于分析当前代码,但是如果$x1-$x2!=0这项行动不难不分部门进行,;精确的相等性检验是数值不稳定性的一个危险信号。贝塔,如何推导出$s1和$s2的公式?请在你的回答中描述一下。在我的第二个公式中,fx3,y3=0,因为fx3,y3=y3=y1+k*x3-x1,然后我把y3推到方程的另一边,将“加”换成“减”,将“减”换成“加”$k*$x3-$x1是线的上升量,从$x1换成$x3。如果不学习代数几何的基础知识,就无法理解这一点。。。描述线路;我对第二个f?没有太多的理解。我知道这无助于分析当前代码,但是如果$x1-$x2!=0这项行动不难不分部门进行,;精确的相等性检验是数值不稳定性的一个危险信号。贝塔,如何推导出$s1和$s2的公式?请在你的回答中描述一下。在我的第二个公式中,fx3,y3=0,因为fx3,y3=y3=y1+k*x3-x1,然后我将y3推到方程的另一边,将“正”换成“负”,将“负”换成“正”,请执行我。。。过了很长时间,我重新阅读了你的答案——我不知道你用哪个公式从x3,y3点到x1,y1-x2,y2线调用$s1高度。你能展示这个公式吗?@GuyFawkes:$s1=$y3-$y1-$k*$x3-$x1;:我问起了通用公式的名字。在我看到的所有直线和高度方程中,斜率都不是这样使用的。我认为它不是三角形的真实高度。它可以
别这样算计,我知道了$s1不是高度,它只是点x3,y3和线上或线上的点之间的Y坐标距离,其上方或下方具有相同的x坐标。所以,如果我们有y=y1+斜率*x-x1,其中y是x3,y3上方或下方点的y坐标,我们可以得到y距离为y3-y=y3-y1-斜率*x-x1,因为x==x3,我们可以将其重写为y3-y1-斜率*x3-x1。我说得对吗?对不起。。。过了很长时间,我重新阅读了你的答案——我不知道你用哪个公式从x3,y3点到x1,y1-x2,y2线调用$s1高度。你能展示这个公式吗?@GuyFawkes:$s1=$y3-$y1-$k*$x3-$x1;:我问起了通用公式的名字。在我看到的所有直线和高度方程中,斜率都不是这样使用的。我认为它不是三角形的真实高度。不能用这种方法计算,我知道了$s1不是高度,它只是点x3,y3和线上或线上的点之间的Y坐标距离,其上方或下方具有相同的x坐标。所以,如果我们有y=y1+斜率*x-x1,其中y是x3,y3上方或下方点的y坐标,我们可以得到y距离为y3-y=y3-y1-斜率*x-x1,因为x==x3,我们可以将其重写为y3-y1-斜率*x3-x1。我说得对吗?