从 3 个变量 x,y,z 的起点到另一点;什么是最好的线性算法。
示例:从 x:0, y=0, z=0 到 x:10, y=20, z=50。
我正在寻找的方式是每个均质增加块上的相同步骤。
编辑模棱两可:我问了这个关于电机控制的问题。电机控制 x 和 y 坐标,但它们不能同时执行步骤。所以我的动作必须像梯子或正方形。因此,我正在寻找 3 个(或更多)坐标的最小阶梯步骤,例如最小二乘逻辑,正好在 c# 中。
您可以使用简单的线性插值:
f(t) = start + t * (end - start), t in [0, 1]
= (1 - t) * start + t * end
如果将 t 增加一个常数,步长也将是常数。如果要执行n
步骤,则应将 t 增加
dt = 1 / n
在每一步。
可以根据坐标独立计算插值。
使用整数坐标,您可以将差异除以最大公约数:
var gcd = Gcd(x2 - x1, y2 - y1, z2 - z1);
var stepX = (x2 - x1) / gcd;
var stepY = (y2 - y1) / gcd;
var stepZ = (z2 - z1) / gcd;
有些线条只有两个步骤,因为它们不能在所有三个维度上均分。(例如(0,0,0)-(17,19,23)
)
或者,您可以使用Bresenham 的线算法
public static IEnumerable<Point> GetPointsOnLine(int x0, int y0, int z0, int x1, int y1, int z1)
{
bool swapXY = Math.Abs(y1 - y0) > Math.Abs(x1 - x0);
bool swapXZ = Math.Abs(z1 - z0) > Math.Abs(x1 - x0);
if (swapXY)
{
int tmp;
tmp = x0; x0 = y0; y0 = tmp;
tmp = x1; x1 = y1; y1 = tmp;
}
if (swapXZ)
{
int tmp;
tmp = x0; x0 = z0; z0 = tmp;
tmp = x1; x1 = z1; z1 = tmp;
}
int deltaX = Math.Abs(x1 - x0);
int deltaY = Math.Abs(y1 - y0);
int deltaZ = Math.Abs(z1 - z0);
int driftXY = deltaX / 2;
int driftXZ = deltaX / 2;
int stepX = x0 <= x1 ? 1 : -1;
int stepY = y0 <= y1 ? 1 : -1;
int stepZ = z0 <= z1 ? 1 : -1;
int y = y0;
int z = z0;
for (int x = x0; x*stepX <= x1*stepX; x += stepX)
{
int xc = swapXY ? y : swapXZ ? z : x;
int yc = swapXY ? swapXZ ? z : x : y;
int zc = swapXZ ? x : z;
yield return new Point(xc, yc, zc);
driftXY -= deltaY;
if (driftXY < 0)
{
y += stepY;
driftXY += deltaX;
}
driftXZ -= deltaZ;
if (driftXZ < 0)
{
z += stepZ;
driftXZ += deltaX;
}
}
}