0

从 3 个变量 x,y,z 的起点到另一点;什么是最好的线性算法。

示例:从 x:0, y=0, z=0 到 x:10, y=20, z=50。

我正在寻找的方式是每个均质增加块上的相同步骤。

编辑模棱两可:我问了这个关于电机控制的问题。电机控制 x 和 y 坐标,但它们不能同时执行步骤。所以我的动作必须像梯子或正方形。因此,我正在寻找 3 个(或更多)坐标的最小阶梯步骤,例如最小二乘逻辑,正好在 c# 中。

4

2 回答 2

1

您可以使用简单的线性插值:

f(t) = start + t * (end - start), t in [0, 1]
     = (1 - t) * start + t * end

如果将 t 增加一个常数,步长也将是常数。如果要执行n步骤,则应将 t 增加

dt = 1 / n

在每一步。

可以根据坐标独立计算插值。

于 2013-05-22T10:15:38.870 回答
0

使用整数坐标,您可以将差异除以最大公约数

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;
        }
    }
}

示范

于 2013-05-22T11:08:36.233 回答