計算機圖形學中繪製直線的bresenham演算法原本是用在繪圖儀上控制x軸方向和y軸方向的兩部電機的,最近遇到乙個十分類似的步進電機控制問題,用bresenham演算法恰好能解決。
問題描述:有左右兩個相同的步進電機,用8051微控制器控制l297 + l298晶元驅動,需要它們同時轉動(同時啟動,同時停止),但轉速不同。例如左側電機正轉180步,同時右側電機反轉97步。這就好比從原點出發畫一條到點(180, -97)的直線。
與電機的介面已抽象為四個函式:
void motorleftshrink(); // 左側電機收緊繩索
void motorleftloose(); // 左側電機放鬆繩索
void motorrightshrink(); // 右側電機收緊繩索
void motorrightloose(); // 右側電機放鬆繩索
另外有兩個輔助函式,分別控制左右電機:
void motorleftstep(int direct)
void motorrightstep(int direct)
現在的任務是寫乙個函式movemotor(),有四個引數,分別為兩個電機轉的步數和方向,讓它控制這兩部電機同時運轉。我用的是整數版本的直線bresenham演算法,取自《計算機圖形學的演算法基礎》一書。
// 引數:absdl、absdr 分別是左右電機轉動的步數
// sdl、sdr 分別是左右電機轉動的方向
void movemotor3(int absdl, int absdr, int sdl, int sdr)
el += 2*absdl;
while (er > 0)
er += 2*absdr;
wait_ms(15); // 等待
}assert(cntl == absdl);
assert(cntr == absdr);
}程式稍作修改後在keil c51上編譯通過,電機運轉情況良好:)
利用Bresenham演算法畫圓和直線
利用bresenham演算法,從零開始實現在矩陣中畫圓和直線,效果如下 close all clear all clc create image reactangle img ones 100 200 figure name original image imshow img draw line h...
Bresenham畫線演算法
bresenham畫線演算法 bresenham演算法是計算機圖形學領域使用最廣泛的直線掃瞄轉換演算法。仍然假定直線斜率在0 1 之間,該方法類似於中點法,由乙個誤差項符號決定下乙個象素點。演算法原理如下 過各行各列象素中心構造一組虛擬網格線。按直線從起點到終點的順序計算直線與各垂直網格線的交點,然...
Bresenham演算法畫圓
下面先簡要介紹常用的畫圓演算法 bresenham演算法 然後再具體闡述筆者對該演算法的改進。乙個圓,如果畫出了圓上的某一點,那麼可以利用對稱性計算餘下的七段圓弧 plot x,y plot y,x plot y,x plot x,y plot x,y plot y,x plot y,x plot ...