私は PHP を使用しており、3D デカルト座標系 (x、y、z) を生成しました。2 点間を直線で移動したい。各 1x1x1 の正方形を、原点に最も近い隣接する格子点によって識別されるセクターと呼びます。線分が通過する各セクターを特定しようとしています。
次の投稿は役に立ちましたが、2D システムを扱っているため、私が必要としていたものではありませんでした。
ありがとう
ジェイソン
私は PHP を使用しており、3D デカルト座標系 (x、y、z) を生成しました。2 点間を直線で移動したい。各 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);
私は専門家ではありませんが、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