精华内容
下载资源
问答
  • DDA直线插补

    2018-12-03 16:15:58
    DDA直线插补matalb实现,带左移规格化处理,插补效果更好,更加便于速度规划。
  • 直线插补程序

    2018-11-16 16:14:23
    运动规划中的MALAB直线插补程序,验证可行,任意象限都可
  • 欧姆龙NJ直线插补及圆弧插补程序与实验
  • 数控技术课程设计 说明书 设计题目 直线插补与圆弧插补程序设计 机械设计以及自动化专业 机械工程学院 机械 102 班 设计者 青岛理工大学 2013 年 6 月 20 日 目 录 1. 设计题目 1 2. 目录 2 3.直线插补流程图 3 4. ...
  • 多段线插补 POLYLINEI/POLYLINEF、直线插补 LINEI/LINEF、圆弧插补 ARCI/ARCF。
  • 直线插补MATLAB程序

    2019-05-24 16:35:13
    平面/空间直线插补;适用在机器人或其他领域,代码测试可能或多或少需要优化
  • 三菱PLC QD75 LD75 圆弧插补 直线插补 画各种图形 视频教程 教程共13集 第1集 Q系列与L系列 程序互相转换教程 第2集 G2000 G2004 G2006 参数用程序设置方式 LD75 QD75 教程 第3集 三菱PLC程序 M代码使用教程 第4集 ...
  • NX1P直线插补和NX1P圆弧插补程序和讲解
  • 直线插补算法

    2021-02-18 17:05:51
    直线插补算法 戎·码一生2015-04-20 17:35:2227176已收藏43 分类专栏:数据结构与算法单片机学习文章标签:直线插补 圆弧插补c语言步进电机 版权 直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行...

    直线插补算法

    戎·码一生 2015-04-20 17:35:22  27176  已收藏 43

    分类专栏: 数据结构与算法 单片机学习 文章标签: 直线插补 圆弧插补 c语言 步进电机

    版权

    直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行比对,看该点在次点的上方或者是下方,从而决定下一步该怎么走。

    即机床数控系统依照一定方法确定刀具运动轨迹的过程。也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点的方法,也称为“数据点的密化”;数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。

    单片机控制步进电机运作,实物图奉上:

    插补算法坐标给进的如下图:

    C语言控制步进电机画直线的代码如下:

     

    
     
    1. NextOffset=0;//每一步要走的偏差判断;

    2.  
    3. if(X >=0 && Y>0) //ONE

    4. {

    5. Number_XY=(X+Y)*50/12.5;

    6.  
    7. while(1)

    8. {

    9. if(NextOffset >= 0 && X0 != X)

    10. {

    11. NextOffset=NextOffset-Y;

    12. X0=X0+1;

    13. Y0=Y0;

    14.  
    15. for(i=0;i<4;i++)

    16. {

    17. P0=Clockwise[i]; //left

    18. Delay30ms();

    19. Number_XY--;

    20. }

    21. }

    22.  
    23. if(NextOffset < 0 && Y0 != Y)

    24. {

    25. NextOffset=NextOffset+X;

    26. X0=X0;

    27. Y0=Y0+1;

    28.  
    29. for(i=0;i<4;i++)

    30. {

    31. P2=Clockwise[i]; //down;

    32. Delay30ms();

    33. Number_XY--;

    34.  
    35. }

    36. }

    37. if(Number_XY <= 0)

    38. break;

    39.  
    40. if(X0==X && Y0==Y)

    41. Number_XY--;

    42. }

    43. }

    44.  
    45.  
    46. if(X < 0 && Y>=0) //TWO

    47. {

    48. X=abs(X);

    49. Number_XY=(X+Y)*50/12.5;

    50. while(1)

    51. {

    52. if(NextOffset >= 0 && X0 != X)

    53. {

    54. NextOffset=NextOffset-Y;

    55. X0=X0+1;

    56. Y0=Y0;

    57.  
    58. for(i=0;i<4;i++)

    59. {

    60. P0=Anti_Clockwise[i]; //RIGHT

    61. Delay30ms();

    62. Number_XY--;

    63. }

    64. }

    65.  
    66. if(NextOffset < 0 && Y0 != Y)

    67. {

    68. NextOffset=NextOffset+X;

    69. X0=X0;

    70. Y0=Y0+1;

    71.  
    72. for(i=0;i<4;i++)

    73. {

    74. P2=Clockwise[i]; //down;

    75. Delay30ms();

    76. Number_XY--;

    77.  
    78. }

    79. }

    80.  
    81. if(Number_XY <= 0)

    82. break;

    83.  
    84. if(X0==X && Y0==Y)

    85. Number_XY--;

    86. }

    87. }

    88.  
    89.  
    90. if(X <=0 && Y<0) //THREE

    91. {

    92. X=abs(X);

    93. Y=abs(Y);

    94. Number_XY=(X+Y)*50/12.5;

    95. while(1)

    96. {

    97. if(NextOffset >= 0 && X0 != X)

    98. {

    99. NextOffset=NextOffset-Y;

    100. X0=X0+1;

    101. Y0=Y0;

    102.  
    103. for(i=0;i<4;i++)

    104. {

    105. P0=Anti_Clockwise[i]; //RIGHT

    106. Delay30ms();

    107. Number_XY--;

    108. }

    109. }

    110.  
    111. if(NextOffset < 0 && Y0 != Y)

    112. {

    113. NextOffset=NextOffset+X;

    114. X0=X0;

    115. Y0=Y0+1;

    116.  
    117. for(i=0;i<4;i++)

    118. {

    119. P2=Anti_Clockwise[i]; //UP

    120. Delay30ms();

    121. Number_XY--;

    122.  
    123. }

    124. }

    125. if(Number_XY <= 0)

    126. break;

    127.  
    128. if(X0==X && Y0==Y)

    129. Number_XY--;

    130. }

    131. }

    132.  
    133.  
    134. if(X >0 && Y <=0 )//FOUR

    135. {

    136. Y=abs(Y);

    137. Number_XY=(X+Y)*50/12.5;

    138. while(1)

    139. {

    140. if(NextOffset >= 0 && X0 != X)

    141. {

    142. NextOffset=NextOffset-Y;

    143. X0=X0+1;

    144. Y0=Y0;

    145.  
    146. for(i=0;i<4;i++)

    147. {

    148. P0=Clockwise[i]; //left

    149. Delay30ms();

    150. Number_XY--;

    151. }

    152. }

    153.  
    154. if(NextOffset < 0 && Y0 != Y)

    155. {

    156. NextOffset=NextOffset+X;

    157. X0=X0;

    158. Y0=Y0+1;

    159.  
    160. for(i=0;i<4;i++)

    161. {

    162. P2=Anti_Clockwise[i]; //UP

    163. Delay30ms();

    164. Number_XY--;

    165.  
    166. }

    167. }

    168. if(Number_XY <= 0)

    169. break;

    170.  
    171. if(X0==X && Y0==Y)

    172. Number_XY--;

    173. }

    174. }

    175.  
    176. }

    C语言圆弧插补代码如下:

     

    
     
    1. NextOffset = Dfr_X*Dfr_X + Dfr_Y*Dfr_Y - Radius*Radius;//偏差初始值;

    2.  
    3. while(1) //one

    4. {

    5. if(NextOffset >= 0 && Dfr_X != 0)

    6. {

    7. NextOffset = NextOffset - 2 * Dfr_X + 1;

    8. Dfr_X=Dfr_X-1;

    9. Dfr_Y=Dfr_Y;

    10.  
    11. for(i=0;i<4;i++)

    12. {

    13. P0=Anti_Clockwise[i]; // right

    14. Delay30ms();

    15. Count_Step++;

    16. }

    17. }

    18.  
    19. if(NextOffset < 0 && Dfr_Y != Radius)

    20. {

    21. NextOffset = NextOffset +2*Dfr_Y + 1;

    22. Dfr_X=Dfr_X;

    23. Dfr_Y=Dfr_Y+1;

    24.  
    25. for(i=0;i<4;i++)

    26. {

    27. P2=Clockwise[i]; // down

    28. Delay30ms();

    29. }

    30. }

    31.  
    32. if(Dfr_X==0 )

    33. break;

    34. }

    35.  
    36.  
    37. while(1) //two

    38. {

    39. if(NextOffset >= 0 && Dfr_Y != 0)

    40. {

    41. NextOffset = NextOffset -2*Dfr_Y + 1;

    42. Dfr_X=Dfr_X;

    43. Dfr_Y=Dfr_Y-1;

    44.  
    45. for(i=0;i<4;i++)

    46. {

    47. P2=Anti_Clockwise[i]; //right

    48. Delay30ms();

    49.  
    50. }

    51.  
    52. }

    53.  
    54. if(NextOffset < 0 && Dfr_X != Radius)

    55. {

    56. NextOffset = NextOffset +2*Dfr_X + 1;

    57. Dfr_X=Dfr_X+1;

    58. Dfr_Y=Dfr_Y;

    59. for(i=0;i<4;i++)

    60. {

    61. P0=Anti_Clockwise[i]; // up

    62. Delay30ms();

    63. }

    64. }

    65.  
    66. if( Dfr_Y==0 )

    67. break;

    68. }

    69.  
    70. while(1) //three

    71. {

    72. if(NextOffset >= 0 && Dfr_X != 0)

    73. {

    74. NextOffset = NextOffset - 2*Dfr_X + 1;

    75. Dfr_X=Dfr_X-1;

    76. Dfr_Y=Dfr_Y;

    77. for(i=0;i<4;i++)

    78. {

    79. P0=Clockwise[i]; //left

    80. Delay30ms();

    81. }

    82. }

    83.  
    84. if(NextOffset < 0 && Dfr_Y != Radius)

    85. {

    86. NextOffset = NextOffset +2*Dfr_Y + 1;

    87. Dfr_X=Dfr_X;

    88. Dfr_Y=Dfr_Y+1;

    89. for(i=0;i<4;i++)

    90. {

    91. P2=Anti_Clockwise[i]; //up

    92. Delay30ms();

    93.  
    94. }

    95.  
    96. }

    97.  
    98. if(Dfr_X==0 )

    99. break;

    100. }

    101.  
    102. while(1) //four

    103. {

    104. if(NextOffset >= 0 && Dfr_Y != 0)

    105. {

    106. NextOffset = NextOffset -2*Dfr_Y + 1;

    107. Dfr_X=Dfr_X;

    108. Dfr_Y=Dfr_Y-1;

    109.  
    110. for(i=0;i<4;i++)

    111. {

    112. P2=Clockwise[i]; //down;

    113. Delay30ms();

    114. }

    115. }

    116.  
    117. if(NextOffset < 0 && Dfr_X != Radius)

    118. {

    119. NextOffset = NextOffset +2*Dfr_X + 1;

    120. Dfr_X=Dfr_X+1;

    121. Dfr_Y=Dfr_Y;

    122. for(i=0;i<4;i++)

    123. {

    124. P0=Clockwise[i]; //left

    125. Delay30ms();

    126. }

    127. }

    128.  
    129. if(Dfr_Y==0 )

    130. break;

    131.  
    132. }

    展开全文
  • 直线插补和圆弧插补

    千次阅读 2019-07-18 14:30:39
    1.三点画圆 原文地址:添加链接描述 2.直线插补和圆弧插补 原文地址:添加链接描述

    1.三点画圆

    在这里插入图片描述
    原文地址:添加链接描述

    2.直线插补和圆弧插补

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    原文地址:添加链接描述

    展开全文
  • 用VB语言实现数控逐点比较直线插补运动的实现 源程序 代码 EXE
  • 三菱PLC插补教程 QD75定位模块 LD75定位模块 圆弧插补 直线插补 画各种图形 频教程+程序案例+手册资料 教程共13集 第1集 Q系列与L系列 程序互相转换教程 第2集 G2000 G2004 G2006 参数用程序设置方式 LD75 QD75 教程...
  • 逐点比较法直线插补,逐点比较法直线插补课件,逐点比较法直线插补PPT
  • 直线插补C语言源程序

    2017-01-04 17:27:40
    直线插补C语言源程序
  • 直线插补源代码C语言

    2017-01-04 17:14:19
    直线插补源代码C语言
  • 逐点比较法直线插补和圆弧插补源码,编译后可以直接下载进51单片机使用。定时器产生脉冲。
  • 逐点比较直线插补算法。
  • 数控技术课程设计 说明书 设计题目 直线插补与圆弧插补程序设计 机械设计以及自动化专业 机械工程学院 机械 102 班 设计者 青岛理工大学 2013 年 6 月 20 日 目 录 1. 设计题目 1 2. 目录 2 3. 直线插补流程图 3 4. ...
  • 基于XY直线插补

    2013-04-14 16:49:04
    可实现CNCxy直线插补运算圆弧插补的c程序
  • 直线插补和圆弧插补的区别

    万次阅读 2019-08-17 10:03:31
    插补(Interpolation),即机床数控系统依照一定方法确定刀具运动轨迹的过程。也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点...直线插补就是数控系统,在起点和终点之间按照直线来密化点群,...

    插补(Interpolation),即机床数控系统依照一定方法确定刀具运动轨迹的过程。也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点的方法,也称为“数据点的密化”;数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。

    一、
    直线插补就是数控系统,在起点和终点之间按照直线来密化点群,然后驱动伺服按照这个点群来运动
    圆弧插补就是这个点群是按照起点终点还有半径或者是圆心坐标来建立方程,运算,建立点群。
    二、
    插补是零件轮廓上的已知点之间,用通过有规律地分配各个轴的单位运动面逼近零件廓形的过程。
    直线插补方式,给出两端点间的插补数字信息借此信息控制刀具的运动,使其按照规定的直线加工出理想的曲面。
    圆弧插补方式,给出两端点间的插补数字信息借此信息控制刀具的运动,使其按照规定的圆弧加工出理想的曲面。
    数控车床的运动控制中,工作台(刀具)X、Y、Z轴的最小移动单位是一个脉冲当量。因此,刀具的运动轨迹是具有极小台阶所组成的折线(数据点密化)。例如,用数控车床加工直线OA、曲线OB,刀具是沿X轴移动一步或几步(一个或几个脉冲当量Dx),再沿Y轴方向移动一步或几步(一个或几个脉冲当量Dy),直至到达目标点。从而合成所需的运动轨迹(直线或曲线)。数控系统根据给定的直线、圆弧(曲线)函数,在理想的轨迹上的已知点之间,进行数据点密化,确定一些中间点的方法,称为插补。
    【注意】由下图可知:不管是直线还是圆弧插补都是走的折线轨迹,只是所对应函数计算(算法)不同;

    数控系统本质上所有的插补运动,都是直线插补。如果目标的曲线不是直线,而是一条不规则的曲线,那么数控会根据这条曲线的点坐标,来确定系统允许的最小跨度来进行一次直线插补,直线插补完成后,比较当前位置的坐标与目标曲线上目标点的坐标,来确定下一条直线插补的起点终点坐标,一小段一小段的直线插补,来拟合用户需要的曲线。而拟合的准确度取决于最小跨度的设置和系统的精度(一个脉冲当量对应的伺服运动距离)
    当然,现在圆弧插补已经应用于各种数控系统,所以圆弧插补也就不需要依赖直线插补来拟合,不过底层的处理机制依然是相同的。

    下面是用逐点比较法的原理来对比直线插补和圆弧插补:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 第6集 不用定位表格数据 直接用编写程序方式控制XY轴插补 直线插补 画斜线 第7集画三角形状 XY轴插补 直线插补 第8集画四方形状 插补 第9集 3轴马达 联动走 五角星 第10集 圆弧插补 第11集 画圆的两种方式 第12集 ...
  • 三菱PLC插补教程 QD75定位模块 LD75定位模块 圆弧插补 直线插补 画各种图形 频教程+程序案例+手册资料 教程共13集 第1集 Q系列与L系列 程序互相转换教程 第2集 G2000 G2004 G2006 参数用程序设置方式 LD75 QD75 教程...
  • Bresenham直线插补算法

    2021-05-20 16:00:11
    Bresenham直线插补算法原理与matlab实现 问题说明:近期研究双振镜(四轴)激光加工系统。由于振镜有最小的脉冲当量(即最小的移动单位),需要使用到插补算法对期望直线进行处理。以下是对Bresenham直线插补算法的...

    Bresenham直线插补算法原理与matlab实现

    问题说明:近期研究双振镜(四轴)激光加工系统。由于振镜有最小的脉冲当量(即最小的移动单位),需要使用到插补算法对期望直线进行处理。以下是对Bresenham直线插补算法的学习笔记。

    参考资料

    clever101博客

    算法原理

    情景:

    加工直线起始点(x1,y1)(x_1,y_1),终止点(x2,y2)(x_2,y_2)

    理论部分

    Bresenham算法是DDA算法画线算法的一种改进算法。本质上它也是采取了步进的思想。不过它比DDA算法作了优化,避免了步进时浮点数运算,同时为选取符合直线方程的点提供了一个好思路。首先通过直线的斜率确定了在x方向进行单位步进还是y方向进行单位步进:当斜率k的绝对值|k|<1时,在x方向进行单位步进;当斜率k的绝对值|k|>1时,在y方向进行单位步进。

    dy=x2x1dy=x_2-x_1dx=y2y1dx=y_2-y_1
    该算法是将直线方程转换为一个迭代的过程。迭代过程是:在计长方向上(设x方向),每次坐标必变化一个单位步长(通常单位步长取1),即xi=xi1+1x_i=x_{i - 1} + 1 (加、减1视dx的正负而定)。
    在非计长方向上(设y方向),每次坐标值是否变化一个单位步长视误差项d而定。
    di>=0d_i>=0时,即yi=yi1+1y_i=y_{i-1}+1(加、减1视dy的正负而定),产生新的误差di+1=di+2(dydx)d_{i+1}=d_i+2(dy-dx)
    di<0d_i<0时,即yi=yi1y_i=y_{i-1},产生新的误差di+1=di+2dyd_{i+1}=d_i+2dy
    误差项d是在同计长方向垂直的方向上,是直线的精确路径同实际产生点之间的距离,如下图所示。
    在这里插入图片描述
    误差项d的推导过程如下:
    dx>dydx>dy(即斜率k<1,x方向上的总行驶路径要大于y方向)且dx,dy>0,单位步长为t(设t=1),当前点(xi1,yi1)(x_{i-1},y_{i-1})是离直线最近的点。
    计算下一点的坐标值,由下图可知

    在这里插入图片描述
    Si>=TiS_i>=T_i,下一点(xi1+1,yi1+1)(x_{i-1}+1,y_{i-1}+1)更接近直线。
    Si<TiS_i<T_i,下一点(xi1+1,yi1)(x_{i-1}+1,y_{i-1})更接近直线。

    所以
    Si>=TiS_i>=T_i,下一点为(xi1+1,yi1+1)(x_{i-1}+1,y_{i-1}+1)
    Si<TiS_i<T_i,下一点为(xi1+1,yi1+1)(x_{i-1}+1,y_{i-1}+1)
    由相似三角形得:
    Si/t=dy/dxS_i/t=dy/dx
    Si=(dy/dx)tS_i=(dy/dx)t
    Ti=tSiT_i=t-S_i
    Ti=t(dy/dx)tT_i=t-(dy/dx)t
    因此SiTi=(2dy/dx)ttS_i-T_i=(2dy/dx)t-t
    可以看出(SiTi)(S_i-T_i)的正负决定了坐标值的变化,而与SiTiS_i-T_i的大小无关。因此dx(SiTi)/tdx(S_i-T_i)/t并不影响SiTiS_i-T_i的正负值。
    di=dx(SiTi)/t=2dydxd_i=dx(S_i-T_i)/t=2dy-dx
    则当di>=0d_i>=0时,走步到点
    xi=xi1+1x_i = x_{i-1}+1
    yi=yi1+1y_i = y_{i-1}+1
    此时产生新的误差项d_{i+1},如下图所示:
    在这里插入图片描述
    由于 di+1=dx(Si+1Ti+1)/td_{i+1} = dx(S_{i+1}-T_{i+1})/t
    从相似三角形的关系得:
    (Si+1+t)/2t=dy/dx(S_{i+1}+t)/2t=dy/dx
    Si+1=dy/dx2ttS_{i+1}=dy/dx * 2t - t
    Ti+1=tSi+1T_{i+1}=t-S_i+1
    Ti+1=2tdy/dx2tT_{i+1}=2t-dy/dx*2t
    Si+1Ti+1=dy/dx2tt2t+dy/dx2tS_{i+1}-T_{i+1}=dy/dx*2t-t-2t+dy/dx*2t
    因此di+1=2dydx2dx+2dy=di+1(dydx)d_{i+1} = 2dy-dx-2dx+2dy=d_{i+1}*(dy-dx)
    di<0d_i<0时,走步到点x_i=x_{i-1}+1,y_i=y_{i-1}
    此时产生新的误差项di+1d_{i+1}
    Si+1/2t=dy/dxS_{i+1}/2t=dy/dx
    Si+1=dy/dx2tS_{i+1}=dy/dx*2t
    Ti+1=tSi+1T_{i+1}=t-S_{i+1}
    Ti+1=tdy/dx2tT_{i+1}=t-dy/dx*2t
    di+1=2dydx+2dy=di+2dyd_{i+1}=2dy-dx+2dy=d_i+2dy

    结论:当i=1时,did_i的初值为
    d1=2dydxd_1=2dy-dx
    di>=0d_i>=0时,x,y方向坐标值都将会发生改变
    xi=xi1+1x_i=x_{i-1}+-1
    yi=yi1+1y_i=y_{i-1}+-1
    加减1根据dx,dy的正负而确定。
    产生新的误差项di+1=di+2(dydx)d_{i+1}=d_i+2(dy-dx)
    di<0d_i<0时,y方向坐标值不发生改变
    xi=xi1+1x_i=x_{i-1}+-1
    yi=yi1y_i=y_{i-1}
    产生新误差项
    di+1=di+2dyd_{i+1}=d_i+2dy

    可以将上述结论推广为适应于dy>dxdy>dx不同走向的直线。此时以y方向为计长方向,每次坐标值变化一个单位步长(加减视dy的正负而定)
    在x方向,坐标值是否变化一个单位步长,视误差项d而定。
    di>=0d_i>=0时,
    xi=xi1+1x_i=x_{i-1}+-1
    yi=yi1+1y_i=y_{i-1}+-1
    产生新的误差
    di+1=di+2(dxdy)d_{i+1}=d_i+2(dx-dy)
    di<0d_i<0
    xi=xi+1x_i=x_{i+1}
    yi=yi1+1y_i=y_{i-1}+-1
    产生新误差
    di+1=di+2dxd_{i+1}=d_i+2dx
    当i=1
    当i=1时, d的初值为d1=2dxdyd_1=2dx-dy。从该式中可看出,当dx<dy时,只要将x与y的坐标值进行交换,就可直接使用dx>dy时的结论来画直线。同时只要用|dy|与|dx|就可以画出不同走向的直线。
    下图为用Bresenham算法画直线的流程图。

    程序流程图

    在这里插入图片描述
    为了简化Bresenham算法,可把对误差项d的计算与判别式转变为不断比较直线所对的水平距离上的测试值(x,y),并重复对该测试值进行增加并测试。每当x,y的值增加到一个可能的新点时,就在屏幕上画出这个点。测试值(x,y)的增量与dx,dy有关。下面是简化后的Bresenham算法流程图
    在这里插入图片描述
    设从点(x1,y1)(x_1,y_1)到点 (x2,y2)(x_2,y_2)
    dx=x2x1dx=x_2-x_1,ix=dxix=|dx|
    dy=y2y1dy=y_2-y_1,iy=dyiy=|dy|
    设x,y为测试值,初值为0,0;plot为逻辑量。当plot为真时,画新点;plot为假时,不画新点。(plotx,ploty)为标识一个新点的坐标,初值为plotxx1plotx=x_1plotyy1ploty=y_1incmax(dx,dy)inc=max(|dx|,|dy|)为终点判断条件。依据两种不同的Bresenham算法画直线(2,7)到(7,3)时所生成的数值,以及由直线算法选择的像素所绘制的直线,在所走路径上有些小小的区别,如下图所示。
    在这里插入图片描述

    总结

    1. 输入线段的起点和终点。

    2. 判断线段的斜率是否存在(即起点和终点的x坐标是否相同),若相同,即斜率不存在,
      只需计算y方向的单位步进(△Y+1次),x方向的坐标保持不变即可绘制直线。

    3. 计算线段的斜率k,分为下面几种情况处理

      a. k等于0,即线段平行于x轴,即程序只需计算x方向的单位步进,y方向的值不变

      b. |k|等于1,即线段的x方向的单位步进和y方向的单位步进一样,皆为1。直接循环△X次计算x和y坐标。

    4. 根据输入的起点和终点的x、y坐标值的大小决定x方向和y方向的单位步进是1还是-1

    5. 画出第一个点。

    6. 若|k| <1,设m =0,计算P0,如果Pm>0,下一个要绘制的点为(Xm+单位步进,Ym),
      Pm+1 = Pm -2△Y;
      否则要绘制的点为(Xm+单位步进,Ym+单位步进)
      Pm+1 = Pm+2
      △X-2*△Y;

    7. 重复执行第七步△X-1次;

    8. 若|k| >1,设m =0,计算Q0,如果Qm>0,下一个要绘制的点为(Xm,Ym+单位步进),
      Pm+1 = Pm -2△X;
      否则要绘制的点为(Xm+单位步进,Ym+单位步进)
      Pm+1 = Pm+2
      △Y-2*△X;

    matlab实现

    % AUTHOR    :CHANDAN KUMAR 
    % TITLE     :BRESENHAM LINE ALGORITHM
    % SUBJECT   :COMPUTER GRAPHICS AND SOLID MODELLING
    % DISCLAIMER:CODE DRAWS A LINE USING BRESENHAM LINE ALGORITHM.
    
    function bresenham_line()
    clc
    clear all
    point = input('Give coord[ x0 y0 x1 y1]: ');
    
    if (abs(point(4)-point(2)) > abs(point(3)-point(1)))       % If the line is steep                                
        x0 = point(2);y0 = point(1); x1 = point(4);y1=point(3);% then it would be converted to 
        token =1;                                              % non steep by changing coordinate
    else
        x0 = point(1);y0 = point(2); x1 = point(3);y1=point(4);
        token = 0; 
    end
    if(x0 >x1)
        temp1 = x0; x0 = x1; x1 = temp1;
        temp2 = y0; y0 = y1; y1 = temp2;
    end
    dx = abs(x1 - x0) ;                              % Distance to travel in x-direction
    dy = abs(y1 - y0);                               % Distance to travel in y-direction
    sx = sign(x1 - x0);                              % sx indicates direction of travel in X-dir
    sy = sign(y1 - y0);                              % Ensures positive slope line
    
    clf, subplot(2,1,1) ,hold on , grid on ,axis([x0-1 x1+1 y0-1 y1+1]);
    title('Bresenham Line Generation Algorithm: Point form')
    x = x0; y = y0;                                  % Initialization of line
    param = 2*dy - dx ;                              % Initialization of error parameter
    for i = 0:dx-1                                   % FOR loop to travel along X
        x_coord(i+1) = x;                            % Saving in matrix form for plot
        y_coord(i+1) = y;
        if (token ==0)                               % Plotting in point form 
            plot(x,y,'r*');                          % For steep line coordinate is again
        else                                         % converted for actual line drawing.
            plot(y,x,'r*');
        end
        param = param + 2*dy;                        % parameter value is modified
        if (param >0)                                % if parameter value is exceeded
            y = y +1*sy;                             % then y coordinate is increased
            param = param - 2*(dx );                 % and parameter value is decreased
            
        end
        x = x + 1*sx;                                % X-coordinate is increased for next point
    end
    subplot(2,1,2)                                   % Plotting in line fragment form
    if (token ==0)
        plot(x_coord,y_coord,'r-','LineWidth',2);
    else
        plot(y_coord,x_coord,'r-','LineWidth',2);
    end
    grid on
    axis([x0-1 x1+1 y0-1 y1+1]);
    title('Bresenham Line Generation Algorithm: Line fragment form')
    
    
    展开全文
  • 原理讲解:https://blog.csdn.net/z893345329/article/details/25922857 c++模拟直线插补和圆弧插补(共5个实例)
  • 基于STM32做的运动控制器代码,支持圆弧直线插补 给有需要的人参考。
  • 今天介绍合信PLC,合信伺服电机直线插补案例,一起看下吧。
  • 三菱PLC QD75 LD75 圆弧插补 直线插补 画各种图形 视频教程 教程共13集+程序案例+资料手册 第1集 Q系列与L系列 程序互相转换教程 第2集 G2000 G2004 G2006 参数用程序设置方式 LD75 QD75 教程 第3集 三菱PLC程序 M...
  • 插补的基本概念、脉冲增量插补与数据采样插补的特点和区别、逐点比较法的基本原理、直线插补和圆弧插补
  • 逐点比较直线插补和圆弧插补

    千次阅读 2020-05-28 08:17:13
    逐点比较直线插补 由于我们将直线的起点平移到了原点,那么我们所比较的就是当前点和目标直线的斜率,当在直线下方,y++; 当在直线上方,x++; 当在直线上,规定x++; 设(xm,ym)为当前点,(xe,ye)为终点 则Fm=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 444
精华内容 177
关键字:

直线插补