在3d笛卡尔图中用直线划分网格线的所有点

时间:2011-08-28 14:40:32

标签: php 3d cartesian

我正在使用PHP并生成了3D笛卡尔坐标系(x,y,z)。我想在两点之间走一条直线。我将每个1x1x1平方称为由最接近原点的相邻格点标识的扇区。我正在尝试识别线段经过的每个扇区。

以下帖子很有帮助,但由于它涉及2D系统,并不完全是我需要的。

PHP Find Coordinates between two points

由于

杰森

3 个答案:

答案 0 :(得分:1)

我不是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);

答案 1 :(得分:0)

我建议看看一个简单的DDA算法,它允许您有效地确定线段通过的规则网格的哪些单元格。本文对此进行了很好的描述,并提供了一个示例实现:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.42.3443&rep=rep1&type=pdf

您可能希望适应外环的终止条件,因为本文考虑的光线与您的情况不同,没有网格边界以外的特定终止点。

答案 2 :(得分:0)

我不是专家,但是一个(愚蠢的?)方法是编写一个找到两个坐标((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