我正在使用 PHP 并生成了一个 3D 笛卡尔坐标系 (x,y,z)。我想在两点之间走直线。我将每个 1x1x1 正方形称为由最接近原点的相邻格点标识的扇区。我正在尝试识别线段通过的每个扇区。
以下帖子很有帮助,但由于它涉及 2D 系统,因此并不是我所需要的。
谢谢
杰森
我正在使用 PHP 并生成了一个 3D 笛卡尔坐标系 (x,y,z)。我想在两点之间走直线。我将每个 1x1x1 正方形称为由最接近原点的相邻格点标识的扇区。我正在尝试识别线段通过的每个扇区。
以下帖子很有帮助,但由于它涉及 2D 系统,因此并不是我所需要的。
谢谢
杰森
我不是 PHP 专家,但这是 3d 系统的相同解决方案:
// Points
$p1 = array(
'x' => 50,
'y' => 50,
'z' => 20,
);
$p2 = array(
'x' => 234,
'y' => 177,
'z' => 100
);
// Work out distances
$pxd = $p2['x'] - $p1['x'];
$pyd = $p2['y'] - $p1['y'];
$pzd = $p2['z'] - $p1['z'];
// Find out steps
$steps = max(abs($pxd), abs($pyd), abs($pzd));
$coords = array();
for ($i = 0; $i < $steps; ++ $i) {
$coords[] = array(
'x' => round($p1['x'] += $pxd / $steps),
'y' => round($p1['y'] += $pyd / $steps),
'z' => round($p1['z'] += $pzd / $steps)
);
}
print_r($coords);
我不是专家,但是一种(愚蠢的?)方法是编写一个函数来找到两个坐标的“中点” ((x1 + x2)/2, (y1 + y2)/2, (z1 + z2) )/2),然后将它们四舍五入以获得真实坐标。现在您可以通过将函数递归地应用于所有腿直到没有新的中间点来找到整个“线”。
func findMiddlePoint(a, b)
return new Point(
((a.x + b.x).abs / 2).round,
((a.y + b.y).abs / 2).round,
((a.z + b.z).abs / 2).round)
func findLine(points, a, b)
if a == b # no new points
return
middle = findMiddlePoint(a, b)
points.add(middle)
findLine(points, a, middle)
findLine(points, middle, b)
func findFullLine(a, b)
points = []
points.add(a)
findLine(points, a, b)
opints.add(b)
return points