2016-12-14 13 views
0

Я работаю над кодированием ЧПУ. Я могу перемещать оси x и y одновременно, чтобы нарисовать линии (алгоритм Брешенема). Теперь я хочу добавить третью ось, но я не знаю, как перейти от (x0, y0, z0) к (x1, y1, z1).Управление 3 степперами для перемещения по оси xyz

Есть ли какой-либо алгоритм для этой цели?

+1

Возможно, поиск алгоритма 3D Брешенема? –

ответ

0

Используйте снова 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;

+0

Возможно ли передать функцию move_to_point()? Поскольку я написал другой способ только для x и y – Celosad

+0

move_to_point, он абстрактный. Вы должны поставить шаг выполнения каждого шагового двигателя в соответствующий if-section. То есть X = X + знак (DX); означает «перемещать ось оси X на один шаг вперед, если DX> 0 или наоборот в противном случае» – AterLux

+0

Я исправил ответ. – AterLux