1

私は PHP を使用しており、3D デカルト座標系 (x、y、z) を生成しました。2 点間を直線で移動したい。各 1x1x1 の正方形を、原点に最も近い隣接する格子点によって識別されるセクターと呼びます。線分が通過する各セクターを特定しようとしています。

次の投稿は役に立ちましたが、2D システムを扱っているため、私が必要としていたものではありませんでした。

PHPは2点間の座標を見つける

ありがとう

ジェイソン

4

2 に答える 2

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);
于 2011-08-31T09:11:53.970 に答える
0

私は専門家ではありませんが、1 つの (ばかげた?) アプローチは、2 つの座標 ((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 
于 2011-08-29T14:07:32.337 に答える