Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 三角形内点解释_Php_Algorithm_Math_Geometry - Fatal编程技术网

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。我说得对吗?