2016-12-14 4 views
0

CNC 코딩 작업 중입니다. x와 y 축을 동시에 움직여 선을 그릴 수 있습니다 (Bresenham의 알고리즘). 이제 세 번째 축을 추가하고 싶지만 (x0, y0, z0)에서 (x1, y1, z1)로 이동하는 방법을 알지 못합니다.3 스테퍼를 xyz 방향으로 이동 제어

그 목적을위한 알고리즘이 있습니까?

+1

3D Bresenham의 알고리즘을 검색 할 수 있습니까? –

답변

0

브레멘 햄을 다시 사용하십시오.

DX = X1-X0; DY = Y1 - Y0; DZ = Y1 - Y0; ... DЪ = Ъ1 - Ъ0;

Dmax = max (| DX |, | DY |, | DX |, ..., | D |); 여기서 | x | = x의 모듈 계수

init X = X0; Y = Y0; Z = Z0; ... Ъ = Ъ0;

초기화하자. 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 

여기서 기호 (X) = (X는 < 0)? -1 : 1;

당신이 갖고있는 축의 수와 상관없이, Bresenham의 알고리즘은 여전히 ​​동일합니다.

축이 볼 수 있듯이 최대 | Dn | 각 단계가 증가합니다.

그건 그렇고. Dmax의 절반으로 모든 En 값을 초기화하면 라인을 더 멋지게 만들 수 있습니다.

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); DX 축이 0보다 큰 경우 X 축 모터를 한 단계 앞으로 이동하거나 그렇지 않으면 " – AterLux

+0

"을 의미합니다. – AterLux