//---------------------------------------------------------------------

//绘制直线的DDA算法基本函数

//---------------------------------------------------------------------

void LineDDA(int x0,int y0,int x1,int y1,int color,HDC hdc)

{

float dy,dx,x,y,m;

dx=x1-x0;

dy=y1-y0;

m=dy/dx;

if(x0

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x<=x1;x++)

{

SetPixel(hdc,x,int(y+0.5),color);

y+=m;

}

}

}

if(x0>x1)

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x>=x1;x--)

{

SetPixel(hdc,x,int(y+0.5),color);

y-=m;

}

}

}

if(y0

{

if(m>=1||m<=-1)

{

m=1/m;

x=x0;

for(y=y0;y<=y1;y++)

{

SetPixel(hdc,int(x+0.5),y,color);

x+=m;

}

}

}

if(y0>y1)

{

if(m<=-1||m>=1)

{

m=1/m;

x=x0;

for(y=y0;y>=y1;y--)

{

SetPixel(hdc,int(x+0.5),y,color);

x-=m;

}

}

}

}

//---------------------------------------------------------------------

//DDA算法对应的演示功能函数

//---------------------------------------------------------------------

void LineDDA_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)

{

float dy,dx,x,y,m,Time;

Time=timeGetTime();

dx=x1-x0;

dy=y1-y0;

m=dy/dx;

if(x0

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x<=x1;x++)

{

BitBlt(hdc,x*10,int(y+0.5)*10,10,10,MemDC,0,0,SRCCOPY);

y+=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(x0>x1)

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x>=x1;x--)

{

BitBlt(hdc,x*10,int(y+0.5)*10,10,10,MemDC,0,0,SRCCOPY);

y-=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0

{

if(m>=1||m<=-1)

{

m=1/m;

x=x0;

for(y=y0;y<=y1;y++)

{

BitBlt(hdc,int(x+0.5)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

x+=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0>y1)

{

if(m<=-1||m>=1)

{

m=1/m;

x=x0;

for(y=y0;y>=y1;y--)

{

BitBlt(hdc,int(x+0.5)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

x-=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

}以上代码仅供参考,编程环境VC.NET,希望能给还没有任何思路的同学一点帮助,完整源文件不提供,请勿开口索要。

//---------------------------------------------------------------------

//绘制直线的中点算法基本函数

//---------------------------------------------------------------------

void LineMID(int x0,int y0,int x1,int y1,int color,HDC hdc)

{

float dx,dy,incrE,incrNE,d,x,y,m;

if(true)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

m=dy/dx;

d=dx-2*dy;

incrE=-2*dy;

incrNE=2*(dx-dy);

x=x0,y=y0;

SetPixel(hdc,x,y,color);

if(m<=1&&m>=-1)

{

if(x0

{

while(x

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x++;

if(y0

SetPixel(hdc,x,y,color);

if(y0>=y1)

SetPixel(hdc,x,(2*y0-y),color);

}

}

if(x0>=x1)

{

while(x>x1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x--;

if(y0

SetPixel(hdc,x,y,color);

if(y0>=y1)

SetPixel(hdc,x,(2*y0-y),color);

}

}

}

if(m1)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

d=dy-2*dx;     //与斜率小于1时候的情况相比,dx与dy的值刚好互换

incrE=-2*dx;

incrNE=2*(dy-dx);

x=x0,y=y0;

if(y0

{

while(y

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y++;

if(x0

SetPixel(hdc,x,y,color);

if(x0>=x1)

SetPixel(hdc,(2*x0-x),y,color);

}

}

if(y0>=y1)

{

while(y>y1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y--;

if(x0

SetPixel(hdc,x,y,color);

if(x0>=x1)

SetPixel(hdc,(2*x0-x),y,color);

}

}

}

}

}

//---------------------------------------------------------------------

//中点算法对应的演示功能函数

//---------------------------------------------------------------------

void LineMID_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)

{

float dx,dy,incrE,incrNE,d,x,y,m,Time;

Time=timeGetTime();

if(true)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

m=dy/dx;

d=dx-2*dy;

incrE=-2*dy;

incrNE=2*(dx-dy);

x=x0,y=y0;

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(m<=1&&m>=-1)

{

if(x0

{

while(x

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x++;

if(y0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(y0>=y1)

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

if(x0>=x1)

{

while(x>x1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x--;

if(y0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(y0>=y1)

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(m1)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

d=dy-2*dx;

incrE=-2*dx;

incrNE=2*(dy-dx);

x=x0,y=y0;

if(y0

{

while(y

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y++;

if(x0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(x0>=x1)

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

if(y0>=y1)

{

while(y>y1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y--;

if(x0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(x0>=x1)

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

}

}

//---------------------------------------------------------------------

bresenham算法是计算机图形学中为了“显示器(屏幕或打印机)系由像素构成”的这个特性而设计出来的算法,使得在求直线各点的过程中全部以整数来运算,因而大幅度提升计算速度

Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法。原理是:

过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。该算法的优点在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列所求的像 //绘制直线的Bresenham算法基本函数

//---------------------------------------------------------------------void LineBRE(int x0,int y0,int x1,int y1,int color,HDC hdc)

{

float dy,dx,x,y,m,d;

dx=x1-x0;

if(x1

dx=-dx;

dy=y1-y0;

if(y1

dy=-dy;

m=dy/dx;

d=-dx;

x=x0,y=y0;

if(x0

{

if(m<=1&&m>=-1)

{

for(x=x0;x<=x1;x++)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

SetPixel(hdc,x,(2*y0-y),color);

else

SetPixel(hdc,x,y,color);

}

}

}

if(x0>=x1)

{

if(m<=1&&m>=-1)

{

for(x=x0;x>=x1;x--)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

SetPixel(hdc,x,(2*y0-y),color);

else

SetPixel(hdc,x,y,color);

}

}

}

if(y0

{

if(m1)

{

for(y=y0;y<=y1;y++)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

SetPixel(hdc,(2*x0-x),y,color);

else

SetPixel(hdc,x,y,color);

}

}

}

if(y0>=y1)

{

if(m1)

{

for(y=y0;y>=y1;y--)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

SetPixel(hdc,(2*x0-x),y,color);

else

SetPixel(hdc,x,y,color);

}

}

}

}

//---------------------------------------------------------------------

//Bresenham算法对应的演示功能函数

//---------------------------------------------------------------------

void LineBRE_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)

{

float dy,dx,x,y,m,d,Time;

Time=timeGetTime();

dx=x1-x0;

if(x1

dx=-dx;

dy=y1-y0;

if(y1

dy=-dy;

m=dy/dx;

d=-dx;

x=x0,y=y0;

if(x0

{

if(m<=1&&m>=-1)

{

for(x=x0;x<=x1;x++)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(x0>=x1)

{

if(m<=1&&m>=-1)

{

for(x=x0;x>=x1;x--)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0

{

if(m1)

{

for(y=y0;y<=y1;y++)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0>=y1)

{

if(m1)

{

for(y=y0;y>=y1;y--)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

}

图形学画直线c语言,计算机图形学:3种画直线算法(转)相关推荐

  1. 计算机图形学直线裁剪原理,计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪...

    计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 (1)算法设计原理 依次处理(p1,q1)(p2,q2)(p3,q3 ...

  2. 计算机图形学画圆vc代码,计算机图形学实验--完整版-带结果--vc++实现.doc

    计算机图形学实验--完整版-带结果--vc实现 计算机图形学实验报告 信息学院计算机专业 20081060183 周建明 综括: 利用计算机编程语言绘制图形,主要实现以下内容: (1).中点算法生成任 ...

  3. 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  4. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法

    在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...

  5. c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...

    VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...

  6. TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体

    TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体 前言 参考视频计算机图形学全套算法讲解和C++编码实现(共23讲配套源码),计算机图形学案例视频讲解以及主页相关算法.孔老师是我的 ...

  7. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...

    OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .<计算 ...

  8. 平移计算机图形学代码注释,求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢...

    求代码注释:计算机图形学的OpenGL画四面体.高手来吧.争取每句都注释下.谢谢 答案:3  信息版本:手机版 解决时间 2018-12-20 05:00 已解决 2018-12-20 01:58 求 ...

  9. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程

    c语言计算机编程三种方法求解非线性方程 本 科 专 业 学 年 论 文题 目:非线性方程求解比较姓 名: 何 娟 专 业: 计算机科学技术系 班 级: 08 级本科(2)班 指 导 老 师: 刘 晓 ...

最新文章

  1. 清华发布《中国AI发展报告2018》:中科院系统AI论文产出全球第一
  2. PHP的学习--Traits新特性
  3. java编程好文章链接收集
  4. 2019 CCPC - 网络选拔赛 A题^^
  5. C++编程笔记:贪心算法实现活动安排问题
  6. MATLAB用递归法求解集合子集,用递归法求一个集合的子集c语言,急!!!
  7. python3.3 连接mysql_python3.3连接mysql数据库
  8. LeetCode(40):组合总和 II
  9. 动态排名系统(整体二分)
  10. Harris角点检测算法 1
  11. 【读书】【中文版】《控制论》(ISBN:978-7-301-09565-2 / K·0415)
  12. Android系统签名文件
  13. JAVA集合4(Map接口)
  14. WPF 登录界面跳转代码
  15. 各种浏览器网页背景颜色护眼设置
  16. APP上架需要准备的材料清单(上架规范和流程)
  17. 纬衡、金蝶、腾讯、迅雷获深圳软件明星企业称号
  18. 力扣刷题(347. 前 K 个高频元素)快速排序
  19. OpenCV 实现读取摄像头、视频读取保存 (C++)
  20. 如何改善毛孔粗大,学养颜心经改善毛孔粗大

热门文章

  1. 用OPENCV C++ 代码实现 检测图片是否有马赛克
  2. 劝各位码友不要去深圳卷皮网络
  3. Python入门习题大全——梦想的度假胜地
  4. [INS-30131] 执行安装程序验证所需的初始设置失败
  5. 根据uuid生成短编码
  6. 电阻式传感器测量原理与测量电路
  7. android 自定义漂浮,Android漂浮背景效果的制作方法
  8. 忆龙2009:iMC UAM以用户组为过滤条件从微软AD服务器上同步指定账户的配置
  9. Fischer比特功率分配算法及MATLAB实现
  10. 《科研伦理与学术规范》网课第三章课后习题答案