计算机图形学中绘制直线的Bresenham算法原本是用在绘图仪上控制X轴方向和Y轴方向的两部电机的,最近遇到一个十分类似的步进电机控制问题,用Bresenham算法恰好能解决。
问题描述:有左右两个相同的步进电机,用8051单片机控制L297 + L298芯片驱动,需要它们同时转动(同时启动,同时停止),但转速不同。例如左侧电机正转180步,同时右侧电机反转97步。这就好比从原点出发画一条到点(180, -97)的直线。
与电机的接口已抽象为四个函数:
void MotorLeftShrink(); // 左侧电机收紧绳索
void MotorLeftLoose(); // 左侧电机放松绳索
void MotorRightShrink(); // 右侧电机收紧绳索
void MotorRightLoose(); // 右侧电机放松绳索
另外有两个辅助函数,分别控制左右电机:
void MotorLeftStep(int direct)
{
if (direct == 1)
MotorLeftLoose();
else if (direct == -1)
MotorLeftShrink();
}
void MotorRightStep(int direct)
{
if (direct == 1)
MotorRightLoose();
else if (direct == -1)
MotorRightShrink();
}
现在的任务是写一个函数MoveMotor(),有四个参数,分别为两个电机转的步数和方向,让它控制这两部电机同时运转。我用的是整数版本的直线Bresenham算法,取自《计算机图形学的算法基础》一书。
// 参数:absDL、absDR 分别是左右电机转动的步数
//sDL、sDR 分别是左右电机转动的方向
void MoveMotor3(int absDL, int absDR, int sDL, int sDR)
{
int steps = max(absDL, absDR);
int eL = 2*absDL - steps;// 误差累积项
int eR = 2*absDR - steps; // 误差累积项
int cntL = 0;
int cntR = 0;
for (int i = 0; i < steps; ++i) {// 以转动步数较多的为主,进行循环
while (eL > 0) {
++cntL;
MotorLeftStep(sDL);
eL -= 2*steps;
}
eL += 2*absDL;
while (eR > 0) {
++cntR;
MotorRightStep(sDR);
eR -= 2*steps;
}
eR += 2*absDR;
wait_ms(15); // 等待
}
assert(cntL == absDL);
assert(cntR == absDR);
}
程序稍作修改后在KEIL C51上编译通过,电机运转情况良好:)
分享到:
相关推荐
1. 通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及bresenham算法的基本原理; 2. 掌握以上算法生成直线段的基本过程; 3. 通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及...
用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。
图形学实验报告,利用bresenham算法实现画图程序
直线栅格化,Bresenham算法实现程序,直线的Bresenham算法实现
3、编程实现利用DDA算法、中点算法和Bresenham算法生成直线,并显示。 同时要求:(1)实现可动态修改直线的起始点坐标和终点坐标 (2)实现可动态选择线的颜色和线宽。 4、编程实现利用1/8圆中点算法和Bresenham...
利用Bresenham算法生成从(0,0)点到(150,100)的直线段。 WIN-TC下运行通过
1直线中点Bresenham算法1直线中点Bresenham算法1直线中点Bresenham算法1直线中点Bresenham算法1直线中点Bresenham算法1直线中点Bresenham算法
Bresenham直线生成算法 直线Bresenham算法思想: 在另一个方向(即直线变化较小的方向)坐标的0.5处,引出“象素分界线”栅条。按直线从起点到终点的顺序,当变化较大方向的坐标每次步进一个单位时,另一个方向依...
实现Bresenham算法画任意斜率直线实现Bresenham
MFC下实现DDA算法、一般直线的Bresenham算法、Bresenham画圆算法 、中点圆整数优化
计算机图形学--用JAVA实现Bresenham算法画圆,注意画的是个整圆,而不是一段圆弧,同时加上了网格线
计算机图形学 Bresenham算法画圆
vc下实现DDA、Bresenham算法画直线
利用verilog语言与Bresenham算法生成的圆
bresenham画线算法,任意点间画线,不局限于第一象限斜率小于1的情况
圆的绘制(DDA算法和Bresenham算法)。
看看有没帮助,关于计算机图形学中直线的算法
案例2-直线中点Bresenham算法,简单易懂,详细代码
DDA算法Bresenham算法和画家算法PPT课件.pptx
很好的解决描述了 Bresenham算法 初学者勿喷!