php 求一个点和一条线段的距离,而不是二维中的一条线
php find distance of a point and a line segment not a line in 2D
我有一条直线的两个点,如 p1(a,b) 和 p2(c,d)
我的观点是 X(x,y)
我已经搜索并找到了 here
但它不是 php
谁能帮帮我
免责声明:我假定链接答案中的 JS 代码有效。
下面是我尝试将 javascript 代码从 here 转换为 PHP。
function sqr($x) { return $x * $x; }
function dist2($v, $w) { return sqr($v->x - $w->x) + sqr($v->y - $w->y); }
function distToSegmentSquared($p, $v, $w) {
$l2 = dist2($v, $w);
if ($l2 == 0) return dist2($p, $v);
$t = (($p->x - $v->x) * ($w->x - $v->x) + ($p->y - $v->y) * ($w->y - $v->y)) / $l2;
$t = max(0, min(1, $t));
return dist2($p, (object) array('x' => $v->x + $t * ($w->x - $v->x),
'y' => $v->y + $t * ($w->y - $v->y) ));
}
function distToSegment($p, $v, $w) { return sqrt(distToSegmentSquared($p, $v, $w)); }
像这样使用它:
$p = (object) array('x' => 2, 'y' => 2);
$v = (object) array('x' => 9, 'y' => 2);
$w = (object) array('x' => 2, 'y' => 9);
echo distToSegment($p, $v, $w);
比较 JS 输出与 PHP 输出:
测试 1
对于
x = {x:2, y:2}
v = {x:9, y:2}
w = {x:2, y:9}
JS 输出:
4.949747468305833
PHP 输出:
4.9497474683058
测试 2
对于
x = {x:1, y:9}
v = {x:4, y:4}
w = {x:4, y:9}
JS 输出:
3
PHP 输出:
3
测试 3
对于
x = {x:5, y:6}
v = {x:2, y:9}
w = {x:8, y:2}
JS 输出:
0.32539568672798375
PHP 输出:
0.32539568672798
我有一条直线的两个点,如 p1(a,b) 和 p2(c,d) 我的观点是 X(x,y)
我已经搜索并找到了 here
但它不是 php 谁能帮帮我
免责声明:我假定链接答案中的 JS 代码有效。
下面是我尝试将 javascript 代码从 here 转换为 PHP。
function sqr($x) { return $x * $x; }
function dist2($v, $w) { return sqr($v->x - $w->x) + sqr($v->y - $w->y); }
function distToSegmentSquared($p, $v, $w) {
$l2 = dist2($v, $w);
if ($l2 == 0) return dist2($p, $v);
$t = (($p->x - $v->x) * ($w->x - $v->x) + ($p->y - $v->y) * ($w->y - $v->y)) / $l2;
$t = max(0, min(1, $t));
return dist2($p, (object) array('x' => $v->x + $t * ($w->x - $v->x),
'y' => $v->y + $t * ($w->y - $v->y) ));
}
function distToSegment($p, $v, $w) { return sqrt(distToSegmentSquared($p, $v, $w)); }
像这样使用它:
$p = (object) array('x' => 2, 'y' => 2);
$v = (object) array('x' => 9, 'y' => 2);
$w = (object) array('x' => 2, 'y' => 9);
echo distToSegment($p, $v, $w);
比较 JS 输出与 PHP 输出:
测试 1
对于
x = {x:2, y:2}
v = {x:9, y:2}
w = {x:2, y:9}
JS 输出:
4.949747468305833
PHP 输出:
4.9497474683058
测试 2
对于
x = {x:1, y:9}
v = {x:4, y:4}
w = {x:4, y:9}
JS 输出:
3
PHP 输出:
3
测试 3
对于
x = {x:5, y:6}
v = {x:2, y:9}
w = {x:8, y:2}
JS 输出:
0.32539568672798375
PHP 输出:
0.32539568672798