Используйте снова Bresenham.
Пусть DX = X1 - X0; DY = Y1 - Y0; DZ = Y1 - Y0; ... DЪ = Ъ1 - Ъ0;
Пусть Dmax = max (| DX |, | DY |, | DX |, ..., | DЪ |); где | x | = модуль x
Давайте инициализируем X = X0; Y = Y0; Z = Z0; ... Ъ = Ъ0;
Предположим init EX = 0; EY = 0; EZ = 0; .... EЪ = 0;
for i := 1 to Dmax do
EX = EX + |DX|;
if EX >= Dmax then
EX = EX -Dmax;
X = X + sign(DX);
MOTOR_X_ONE_STEP(DX > 0 ? FORWARD : BACKWARD);
end if
EY = EY + |DY|;
if EY >= Dmax then
EY = EY -Dmax;
Y = Y + sign(DY);
MOTOR_Y_ONE_STEP(DY > 0 ? FORWARD : BACKWARD);
end if
EZ = EZ + |DZ|;
if EZ >= Dmax then
EZ = EZ -Dmax;
Z = Z + sign(DZ);
MOTOR_Z_ONE_STEP(DZ > 0 ? FORWARD : BACKWARD);
end if
...
EЪ = EЪ + |DЪ|;
if EЪ >= Dmax then
EЪ = EЪ -Dmax;
Ъ = Ъ + sign(DЪ);
MOTOR_Ъ_ONE_STEP(DЪ > 0 ? FORWARD : BACKWARD);
end if
// Now we are in the point (X, Y, Z, ..., Ъ);
end for
, где знак (х) = (х < 0)? -1: 1;
не имеет значения, сколько у вас оси, алгоритм Брешенема все тот же для всех из них.
Как вы можете видеть ось, максимальная | Dn | будет увеличиваться каждый шаг.
Кстати. Вы можете заставить линию выглядеть лучше, если значения init все En с половиной Dmax:
EX = Dmax/2; EY = Dmax/2; EZ = Dmax/2; .... EЪ = Dmax/2;
Возможно, поиск алгоритма 3D Брешенема? –