图形学画直线c语言,计算机图形学:3种画直线算法(转)
//---------------------------------------------------------------------
//绘制直线的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种画直线算法(转)相关推荐
- 计算机图形学直线裁剪原理,计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪...
计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 (1)算法设计原理 依次处理(p1,q1)(p2,q2)(p3,q3 ...
- 计算机图形学画圆vc代码,计算机图形学实验--完整版-带结果--vc++实现.doc
计算机图形学实验--完整版-带结果--vc实现 计算机图形学实验报告 信息学院计算机专业 20081060183 周建明 综括: 利用计算机编程语言绘制图形,主要实现以下内容: (1).中点算法生成任 ...
- 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法
作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...
- c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...
VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...
- TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体
TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体 前言 参考视频计算机图形学全套算法讲解和C++编码实现(共23讲配套源码),计算机图形学案例视频讲解以及主页相关算法.孔老师是我的 ...
- 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...
OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 .<计算 ...
- 平移计算机图形学代码注释,求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢...
求代码注释:计算机图形学的OpenGL画四面体.高手来吧.争取每句都注释下.谢谢 答案:3 信息版本:手机版 解决时间 2018-12-20 05:00 已解决 2018-12-20 01:58 求 ...
- c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程
c语言计算机编程三种方法求解非线性方程 本 科 专 业 学 年 论 文题 目:非线性方程求解比较姓 名: 何 娟 专 业: 计算机科学技术系 班 级: 08 级本科(2)班 指 导 老 师: 刘 晓 ...
最新文章
- String和常量池
- oracle 日期排序_日期居然用字符串保存?我笑了
- NYOJ 630 Problem of IP
- 短视频技术详解:Android端的短视频开发技术
- QDoc包括外部代码includingexternalcode
- hdu 2112 ——HDU Today
- (宏)Word 纯文本粘贴
- 机器人学导论学习笔记No.1-第一章 :概述
- 普元EOS的项目部署
- Sony 入股 Epic,新世代游戏巨头分道扬镳的开始
- 自发光效果(控制自发光的颜色、强度,呼吸光可选)
- 原生JS获取QQ好友列表
- 《把时间当作朋友》之读后感
- Android WLAN框架
- Golang big.int类型转int
- 【C++】IO库 : IO类,文件输入输出,string流
- window7激活方法
- GNVM版本下载太慢用淘宝镜像速度提百倍哈
- 详解分析MySQL8.0的内存消耗
- 计算机与农业机械化,计算机与农业机械化的相关性研究.pdf