DDA算法

合集下载

计算机图形学实验二:直线的生成算法的实现

计算机图形学实验二:直线的生成算法的实现

实验二: 直线的生成算法的实现班级 08信计2班学号 20080502055 姓名分数一、实验目的和要求:1.理解直线生成的原理;2.掌握几种常用的直线生成算法;3.利用C实现直线生成的DDA算法。

二、实验内容:1.了解直线的生成原理2、掌握几种基本的直线生成算法: DDA画线法、中点画线法、Bresenham画线法。

3、仿照教材关于直线生成的DDA算法, 编译程序。

4.调试、编译、运行程序。

三、实验过程及结果分析1.直线DDA算法:算法原理:已知过端点P0(x0,y0), P1(x1,y1)的直线段L(P0,P1), 斜率为k=(y1-y0)/(x1-x0), 画线过程从x的左端点x0开始, 向x右端点步进, 步长为1个像素, 计算相应的y坐标为y=kx+B。

计算y i+1 = kx i+B=kx i +B+kx=y i +kx当x=1,yi+1=yi+k, 即当x每递增1, y递增k。

由计算过程可知, y与k可能为浮点数, 需要取y整数, 源程序中round(y)=(int)(y+0.5)表示y四舍五入所得的整数值。

(1)程序代码:#include"stdio.h"#include"graphics.h"void linedda(int x0,int y0,int x1,int y1,int color){int x,dy,dx,y;float m;dx=x1-x0;dy=y1-y0;m=dy/dx;y=y0;for(x=x0;x<=x1;x++){putpixel(x,(int)(y+0.5),color);y+=m;setbkcolor(7);}}main(){int a,b,c,d,e;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode,"");a=100;b=100;c=200;d=300;e=5;linedda(a,b,c,d,e);getch();closegraph();}运行结果:2.中点画线算法:假定所画直线的斜率为k∈[0,1], 如果在x方向上增量为1, 则y方向上的增量只能在0~1之间。

数字积分法

数字积分法

Numerical Control
Date: 2006-04 File: interpolation.22
MECHINCAL ENGINEERING, TUST
Interpolation
4.数字积分法合成进给速度
V=F?
F——编程速度 v——插补合成速度
Numerical Control
Date: 2006-04 File: interpolation.23
Interpolation
数,字插积补分直法线的的特终点点是坐,标脉为冲E源(X每e产,生Ye一)个,脉则冲X,,Y作方一向次的累平加均计进算给,频如率果fx,脉f冲y为源频率为fg(Hz)
fx
Xe 2n
fg
式中 m—累加次数 。
fy
Ye 2n
fg
假设脉冲当量为(mm/脉冲),可求得X和Y方向进给速度(mm/min)

k(2n 1) 1
k 1 2n 1
为使上式成立,不妨取
1 k
代入得累加次数
2n
m 1 2n k
2n 2n
1
1
上式表明,若寄存器位数是n,则直线整个插补过程要进行2n 次累加才能 到达终点。
Numerical Control
Date: 2006-04 File: interpolation.10
MECHINCAL ENGINEERING, TUST
Interpolation
例 见P22页例2-4
y
B
5 4 3 2 1
0 1 2 3 4 5 Ax
Numerical Control
Date: 2006-04 File: interpolation.18

直线生成算法DDA、Midpoint、Bresenham

直线生成算法DDA、Midpoint、Bresenham

1、直线生成算法1.算法分析1)DDA设直线两端点:P1(x1,y1)及 P0(x0,y0),dx=x1-x0,dy=y1-y0直线斜率:k=dy/dx直线方程: y=k*x+b有:y1=k*x1+b=k*x0+k*dx+b=y0+k*dx当dx=1时,有y1=y0+k算法复杂度:加法+取整优点:避免了y=k*x+b 方程中的浮点乘法,比直接用点斜式画线快 缺点:需浮点数加法及取整运算,不利于硬件实现.2)Midpoint当前像素点为P(xP,yP),下一个像素点有两种可选择点P1(xP+1,yP),P2(xP+1,yP+1)。

若M=(xP+1,yP+0.5)为P1与P2的中点,Q 为理想直线与x=xP+1垂线的交点。

x Pi=(xi, yi ) M Q P1 p2y当M 在Q 的上方时,应取P1为下一点;当M 在Q 的下方时,应取P2为下一点;直线段L (P0(x0,y0),P1(x1,y1)),用方程F (x,y )=ax+by+c=0表示 a=y0-y1,b=x1-x0,c=x0y1-x1y0有点与L 的关系:线上:F (x,y )=0上方:F (x,y )>0下方:F (x,y )<0判别式:d=F(M)=F(xP+1,yP+0.5)=a(xP+1)+b(yP+0.5)+cD 是xP,yP 的线性函数,可采用增量计算,提高运算效率:1)若d>=0,取P1,d1=d+a,增量为a2)若d<=,取P2,d2=d+a+b,增量为a+b可用2d 代替d 来摆脱浮点运算,写出仅含整数运算的算法3)Bresenhamy x F(x,y)=0 F(x,y)>0 F(x,y)<0 (x1,y1)(x0,y0)设直线方程为y=kx+b,有y1=y0+k(x-x0)=y0+k是否增1取决于误差项d的值,初始值d0=0X每增加1,有d=d+k令e=d-0.5,e0=-0.5,增量为k当e>=0时,取当前像素(xi,yi)的右上方像素(xi+1,yi+1),e 减小1;当e<0时,更接近于右方像素(xi+1,yi)。

多段DDA直线扫描转换算法

多段DDA直线扫描转换算法

技 术 创 新
根据定理和推论 $ 找到第一对满足 条件的点是第 I 个点和第 II 个 点 $ 这两点之 间的线 段 即 是 整 条 直 线 可 重 复 的 最 小 生 成 段 @C 轴 () 轴 的 平 移量分别为 /FID $:FQ% 以后的点可通过最小生成段平 移得到 % 如第 IP 个点通过第 P 个点平移 &ID@Q #$ 第 IR 个点通过第 R 个点平移 &ID@Q #$ 依次类推 $ 可画完所有 的点 %
您的论文得到两院院士关注
中 文 核 心 期 刊 ! 微 计 算 机 信 息 " ( 管 控 一 体 化 )2005 年 第 21 卷 第 8 期
设直线 ! 可以分为 !"#!$# # #!%&$ 共 % 段 $!" 为 最 小生成段 $!" 以后的每个点均可以由 !" 中的相应点平 移 实 现$但 在 算 法 设 计 过 程 中 $为 了 减 少 乘 法 次 数 采 用第 ’(’)$#*## #%&$+ 段由第 ’&$ 段平移实现 % 以 ,,算法为基础提出改进的算法如下 &
( 投稿日期 Y*""]EAEX+ ( 修稿日期 Y*""]EBE$+
? (2+ $ 在开始的第一个重复段内计算与 ,,- 算法相
同 $ 但是多出了用于重复段判断的两次浮点减法 和一 次比较运算 % 在以后的线段复制过程中 $ 每一 个点只
中国自控网 !http://www.autocontrol.com.cn &WX& 120 元 / 年 邮局订阅号 !82-946 !!!
电话 !010-62132436 "62192616 #T/F $ ! P LC 技术应用 200 例 "

计算机图形学DDA算法生成直线实验报告

计算机图形学DDA算法生成直线实验报告

盐城师范学院数学科学学院实验报告课程名称计算机图形学班级08(6)学号15号姓名陈叶玲实验地点主楼B408 实验日期4月21日实验学时2课时实验名称DDA算法生成直线实验类型 基础性 综合性 设计性实验目的:理解基本图形元素光栅化的基本原理,掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的DDA算法。

实验环境:(包括软件平台和硬件平台)工具:VC++6.0操作系统版本:WINGDOWS-XP2,主要硬件:CPU 2.4GHz,内存 512M,显示器:三星SyncMaster793DF实验内容及步骤 (含源程序):直线是图形中最基本的元素,DDA算法是基于数字微分思想的直线声成算法,而Bresenham算法是比较常用和效果良好的直线算法。

通过本次试验学生对比学习直线的生成算法和图形效果的优良评价。

近一步巩固学生的程序设计能力和图形库使用的能力,以及图形算法的理解和掌握。

源程序:#include <GL/glut.h>void LineDDA(int x0,int y0,int x1,int y1/*,int color*/){int x, dy, dx, y;float m;dx=x1-x0;dy=y1-y0;m=dy/dx;y=y0;glColor3f (1.0f, 1.0f, 0.0f);glPointSize(1);for(x=x0;x<=x1; x++){glBegin (GL_POINTS);glVertex2i (x, (int)(y+0.5));glEnd ();y+=m;}}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f (1.0f, 0.0f, 0.0f);glRectf(25.0, 25.0, 75.0, 75.0);glPointSize(5);glBegin (GL_POINTS);glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 0.0f);glEnd ();LineDDA(0, 0, 200, 300);glBegin (GL_LINES);glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (100.0f, 0.0f);glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (180.0f, 240.0f); glEnd ();glFlush();}void Init(){glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);}void Reshape(int w, int h){glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("Hello World!");Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMainLoop();return 0;}实验结果及分析:通过本次实验,初步了解了计算机图形学在计算机图像处理,工程制作,平面设计上的应用,掌握了计算机绘制圆和直线的几种算法,DDA直线和圆的生成算法,并且理解和掌握了他们的优缺点,在以后的实验中会努力学习,争取把这门计算机图形学课学好。

第二章DDA算法

第二章DDA算法

第二章DDA算法1.简介数字差分分析(Digital Differential Analyzer,DDA)算法是一种基于直线斜率来计算线段上的点坐标的算法。

它是一种简单且效率较高的画线算法,在计算机图形学中被广泛应用。

2.基本原理DDA算法基于两点之间的斜率来计算线段的各个点坐标。

给定线段的起始点和终点坐标(x0,x0)和(x1,x1),我们可以根据其斜率x计算每个点的坐标。

为了得到坐标的整数部分,我们可以采用四舍五入的方式进行计算。

DDA算法的基本原理可以用以下公式来表示:x(x+1)=x(x)+xxx(x+1)=x(x)+xx其中x(x)和x(x)表示当前点的坐标xx=(x1-x0)/x为x轴方向上每个点的增量xx=(x1-x0)/x为x轴方向上每个点的增量。

3.算法步骤DDA算法的具体步骤如下:步骤1:输入线段的起始点和终点坐标(x0,x0)和(x1,x1)。

步骤2:计算斜率x=(x1-x0)/(x1-x0)。

步骤3:计算增量xx=(x1-x0)/x和xx=(x1-x0)/x。

步骤4:初始化坐标(x(0),x(0))。

步骤5:对x从0到x-1循环执行以下步骤:(a)计算下一点的坐标:x(x+1)=x(x)+xx和x(x+1)=x(x)+xx。

(b)将(x(x+1),x(x+1))描绘到屏幕上。

4.算法分析DDA算法的时间复杂度为x(N),其中x为线段上像素点的数量。

由于DDA算法只需要进行加法和乘法运算,因此它的速度较快。

然而,由于每次计算点的坐标时需要执行浮点数运算,可能存在舍入误差问题。

此外,由于DDA算法是一种逐点计算的算法,因此对于绘制一条较长的线段来说,可能会产生较多的绘制操作,影响绘制的效率。

5.算法改进为了提高DDA算法的效率,可以采用如下改进方法:(a)使用整数运算:可以使用整数运算来代替浮点数运算,以避免舍入误差的问题。

(b) 使用Bresenham算法:Bresenham算法是一种更高效的画线算法,可以避免DDA算法中每个点的精确计算,从而提高绘制效率。

dda数字积分法

dda数字积分法数字积分法(Digital Differential Analyzer,简称DDA)是一种常见的计算机图形学算法,用于绘制直线和曲线。

它通过离散化空间,将连续的线段或曲线分割成若干离散的像素点,从而实现在屏幕上绘制图形的目的。

DDA算法是一种简单而有效的算法,它使用了数学上的差分思想,通过计算直线或曲线的斜率,按照相应的步长在屏幕上绘制出线段或曲线。

在这个过程中,DDA算法仅需进行一次斜率计算和一次像素绘制操作,因此效率较高。

此外,DDA 算法的原理也较为直观,易于理解和实现。

在DDA算法中,首先需要确定直线(或曲线)的起点和终点坐标,然后计算出斜率。

接着,根据斜率选择适当的步长,并在屏幕上按照步长绘制出像素点。

具体的实现步骤如下:1. 输入直线(或曲线)的起点和终点坐标。

2. 计算直线(或曲线)的斜率。

如果是直线,可以使用斜率公式: K = (y2 - y1) / (x2 - x1)。

如果是曲线,可以通过给定函数获取斜率。

3. 确定适当的步长(step),一般可以选择x轴或y轴的最大差值作为步长。

例如,如果x轴的最大差值大于y轴的最大差值,则可以选择x轴差值作为步长。

4. 根据所选择的步长计算出像素点的数量,例如,如果步长是1,则需要+1个像素点。

5. 通过逐步增加步长和计算出相应的像素点坐标,最终绘制出线段或曲线。

为了更好地理解DDA算法的原理和实现,下面将详细介绍一种常见的直线绘制实现方法。

```pythondef dda_line(x1, y1, x2, y2):dx = abs(x2 - x1)dy = abs(y2 - y1)# 确定适当的步长if dx > dy:step = dxelse:step = dy# 计算每一步的增量x_increment = dx / stepy_increment = dy / step# 初始化起点坐标x = x1y = y1# 绘制起点像素点plot_pixel(round(x), round(y))# 迭代绘制每一步for i in range(step):x += x_incrementy += y_increment# 绘制像素点plot_pixel(round(x), round(y))```在以上代码中,plot_pixel函数用于绘制像素点,它可以根据具体的绘图环境进行相应的变换和操作。

dda数字积分插补算法

dda数字积分插补算法DDA(Digital Differential Analyzer)数字积分插补算法是计算机图形学中常用的一种直线段插值算法。

它的主要作用是根据给定的两个端点坐标,通过在直线上等间距采样的方式,计算出直线上各个点的坐标值,从而实现直线的平滑插值。

DDA算法的基本思想是利用直线的斜率来逐步逼近直线的路径,从而计算出直线上各个点的坐标。

具体步骤如下:1. 计算出直线的斜率k,即直线在x轴上的单位增量Δx与在y轴上的单位增量Δy的比例:k = Δy / Δx。

2. 选择直线上两个端点中x值较小的一个作为起始点,并以其坐标值(x0,y0)作为起始值。

3. 将起始点的坐标值作为当前点的坐标值,并将其绘制到屏幕上。

4. 通过递增x坐标值的方式,计算出下一个点的y坐标值,即y = y0 + k。

5. 将下一个点的坐标值(x0+1,y)作为当前点的坐标值,并将其绘制到屏幕上。

6. 重复步骤4和步骤5,直到达到直线的结束点。

通过以上步骤,可以得到直线上各个点的坐标值,从而实现直线的平滑插值。

DDA算法的优点是计算简单、速度快,适用于直线斜率变化不大的情况。

但由于采用等间距采样的方式,可能导致插值结果与实际直线存在误差。

为了更好地理解DDA算法的原理,下面以一个具体的例子来说明。

假设有两个端点坐标分别为(2,2)和(8,5),我们来计算出直线上各个点的坐标。

计算出直线的斜率k = (5-2) / (8-2) = 3/6 = 1/2。

然后,选择起始点(2,2)作为起始值,并将其绘制到屏幕上。

接下来,通过递增x坐标值的方式,依次计算出下一个点的y坐标值。

根据步骤4,我们可以得到以下结果:x | y--------2 | 23 | 2 + 1/2 = 2.54 | 2.5 + 1/2 = 35 | 3 + 1/2 = 3.56 | 3.5 + 1/2 = 47 | 4 + 1/2 = 4.58 | 4.5 + 1/2 = 5我们得到直线上各个点的坐标值为(2,2)、(3,2.5)、(4,3)、(5,3.5)、(6,4)、(7,4.5)和(8,5)。

数字积分法DDA


101 +)110 ① 011
101 +) 011 ① 000
经过2 = 8次累加完成积分运算,因为有5次溢出,所以 积分值等于5。
(二)数字积分直线插补 如图:直线段OA,起点位于原点,终点为A(Xe,Ye),东电 沿X、Y坐标移动的速度为Vx、Vy,则动点沿X、Y坐 标移动的微小增量为: ∆X=Vx∆t Y ∆Y=Vy∆t A(Xe,Ye) 若动点沿OA匀速移动, V、 Vx、Vy均为常数,则有: V V = Vx Vy = =K Vy OA Xe Ye 成立。 O Vx X
011 011 011 011 011 011 011 011
000 011 110 001 1 100 111 010 1 101 1
000 初始状态 111 第一次累加 110 JRx有进位, ∆X溢出 101 JRy有进位, ∆Y溢出 ∆X溢出 100 011 ∆X溢出 ∆Y溢出 010 ∆X溢出 001 000
因而可以得到坐标微小位移增量为: ∆X=Vx∆t=KXe∆t ∆Y=Vy∆t =KYe∆t 所以,可以把动点从原点 走向终点的过程看作X、Y Y 坐标每经过一个单位时间 间隔以K Xe、 K Ye进行累加 的过程,则可得直线积分插补 V 近似表达式为: m X= ∑ (K Xe)∆t
i=1 m
A(Xe,Ye)
例:插补第一象限直线OA,起点为O( 0 , 0 ) ,终点为 A ( 5 , 3 )。取被积函数寄存器分别为JVx, JVy,余数寄存 器分别为JRx 、JRy ,终点计数器为 JE,且都是三位 二进制寄存器。试写出插补计算过程并绘制轨迹。 Y 3 2 1 O 1 2 3 4 5 X A( 5 , 3 )
二、数字积分法插补
数字积分法又称数字微分分析器(Digital Differential Analyzer,简称DDA)。采用该方法进行插补,具有运算 速度快,逻辑功能强,脉冲分配均匀等特点,且只输 入很少的数据,就能加工出直线、圆弧等较复杂的曲 线轨迹,精度也能满足要求。因此,该方法在数控系 统中得到广泛的应用。

第二章 DDA算法


∴欲判断M点是在Q点上方还是在Q点下方,只需把M代入F(x,y),并检 查它的符号。
第三章 图像处理的基本概念 第二章 DDA(数值微分法 )算法
构造判别式: d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c
二、中点画线法
当d<0,M在直线(Q点)下方,取右上方P2;
直线的绘制要求:
1、直线要直。 2、直线的端点要准确(无定向性和断裂)。 3、直线的亮度和色泽要均匀。 4、画线速度要快。 算法如下: • DDA(Digital Differential Analyzer)算法 • 中点画线法 • Bresenham画线算法
第三章 图像处理的基本概念 第二章 DDA(数值微分法 )算法 第二章 DDA算法
• DDA算法就是一个增量算法。
第三章 图像处理的基本概念 第二章 DDA(数值微分法 )算法 第二章 DDA算法
void DDALine(int x 0,int y0,int x1,int y1,int color)
int x; float dx, dy, y, k; dx = x1-x0; dy=y1-y0; k=dy/dx ; y=y0; for (x=x0; xx1; x++) drawpixel (x, int(y+0.5), color);
一、简单方程产生圆弧
算法原理:利用其函数方程,直接离散计 算(考虑1/8圆弧) 公式:xi+1=xi+1 x在[0,R/sqr(2)]
yi+1=round(sqr(R2-Xi+12)
在一定范围内,每给定一X值,可得一Y值。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一:直线的扫描转换
实验目的
通过本次试验,学生可以掌握直线段的扫描转换算法及其程序设计方法。

实验内容
1. 绘制20*20的网格线,格子X 和Y 方向间隔均为20像素,网格起始坐标在(20,20)。


们使用此网格模拟像素矩阵(019,019x y ≤≤≤≤),格子交叉点是像素中心。

2. 输入直线段两端点,可使用以下两种方法之一:
a) 对话框输入
b) 鼠标在网格内以鼠标左键按下-拖动-抬起方式输入。

注意:直线段两端点要自动取
整到模拟的像素中心位置
3. 进行直线段扫描转换,通过点击鼠标右键调用方式或者菜单调用的方式执行。

计算完成
后,将扫描转换结果,在模拟的像素矩阵中,使用圆形显示出来。

方法一:直线的中点算法
对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。

直线段的方程为:
y m x B =+
⇔y
y x B x y y x x B x
∆=
+⇔∆=∆+∆∆ (,)0F x y xy yx xB ⇔=∆-∆-∆= 现在假定已求得像素(,,i r i x y ),则如图得 ,,11
(,]22
i i r i r x x x ∈-
+ 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则
1,,13(,]22i i r i r x x x +∈-
+ 在直线1i y y =+上,区间,,13
(,]22
i r i r x x -+内存在两个像素NE 和E 。

根据取整原则,当
11(,)i i x y ++在中点M 11
(,)2
i i x y ++右方时,取像素NE ,否则取像素E ,即
,11,,1()()01()()0
i r i i r i r i x E F M x x x NE F M x +++⎧
⇔≤=⎨
+⇔>⎩i i 点当(,y +1)在左方时点当(,y +1)在右方时
若取2()i d F M =,则上式变为 ,1,,()01(0
i r i i r i r i x E d x x NE d +⎧
≤=⎨
+>⎩点当点)当
计算i d 的递推公式如下:
,1
1,12[(2)()]012
2(,2)0
122[(2)(1)]
2
i i r i i i i i i i r
x y y x xB d d F x y d x y y x xB ++⎧
∆+-∆+-∆⎪≤⎪=++=⎨
>⎪∆+-∆++-∆⎪⎩
=202()
i i i i d x d d x y d +∆≤⎧

+∆-∆>⎩
算法的初始条件为:
00,00,0(,)(0,0)1
2(,1)22
r r x y x y d F x y x y =⎧

⎨=++=∆-∆⎪⎩
DDA算法:
对于直线y=kx+b:
(1)当|k|<=1时,x每递增1,y就递增k;
(2)当|k|>1时,y每增加1,x就增加1/k;
代码如下:
#include<graphics.h>
#include<conio.h>
void DDALine(int x0,int y0,int x1,int y1,int color) {
float dx,dy,x,y,k;
dx=(float)(x1-x0);
dy=(float)(y1-y0);
k=dy/dx;
x=(float)x0;
y=(float)y0;
if(abs(k)<=1)
{
for(;x<=x1;x++)
{
putpixel(x,int(y+0.5),color);
y=y+k;
}
}
else
{
for(;y<=y1;y++)
{
putpixel(int(x+0.5),y,color);
x=x+1/k;
}
}
}
Void main()
{
initgraph(640,480);
DDALine(0,0,600,1100,RED);
DDALine(0,0,1000,500,GREEN);
DDALine(1,800,500,10,BLUE);
getch();
closegraph();
}
截图:
中点划线法:
对于直线ax+by+=0;
令F(x)=ax+by+c;
其中a=y0-y1;b=x1-x0;c=x0y1-x1y0;
代入M(x,y)点;
令d=F(M);
(1)当d>=0时,d的增量为a;取下一像素点为右边的点
(2)当d<=时,d的增量为a+b,取下一像素点为右上角的点;
代码如下:
#include <graphics.h>
#include <conio.h>
// 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)
void Line_Midpoint(int x1, int y1, int x2, int y2, int color) {
int x = x1, y = y1;
int a = y1 - y2, b = x2 - x1;
int cx = (b >= 0 ? 1 : (b = -b, -1));
int cy = (a <= 0 ? 1 : (a = -a, -1));
putpixel(x, y, color);
int d, d1, d2;
if (-a <= b) // 斜率绝对值<= 1
{
d = 2 * a + b;
d1 = 2 * a;
d2 = 2 * (a + b);
while(x != x2)
{
if (d < 0)
y += cy, d += d2;
else
d += d1;
x += cx;
putpixel(x, y, color);
}
}
else // 斜率绝对值> 1
{
d = 2 * b + a;
d1 = 2 * b;
d2 = 2 * (a + b);
while(y != y2)
{
if(d < 0)
d += d1;
else
x += cx, d += d2;
y += cy;
putpixel(x, y, color);
}
}
}
// 主函数
void main()
{
initgraph(640, 480);
// 测试画线
Line_Midpoint(100, 1, 1, 478, GREEN);
Line_Midpoint(1, 478, 638, 1, GREEN);
// 按任意键退出
getch();
closegraph();
}
截图:。

相关文档
最新文档