问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用中点Bresenham算法完成直线扫描转换?

发布网友 发布时间:2022-05-24 21:00

我来回答

1个回答

热心网友 时间:2023-11-01 23:10

#include <gl/glut.h>
#include<math.h>
#include<stdio.h>

void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色
glMatrixMode(GL_PROJECTION); //设置投影参数
gluOrtho2D(-10.0,10.0,-10.0,10.0);
}

void LineMidPointBre(GLint x0, GLint y0, GLint x1, GLint y1)
{
GLint dx,dy,d,UpIncre,DownIncre,x,y;
if(x0>x1)
{
x=x1; x1=x0; x0=x;
y=y0; y1=y0; y0=y;
}
x=x0;
y=y0;
dx=x1-x0;
dy=y1-y0;
if(dy>0&&dy<=dx)//0<k<=1中点Bresenham算法的代码
{
d=dx-2*dy;
UpIncre=2*dx-2*dy;
DownIncre=-2*dy;
while(x<=x1)
{
glPointSize(3);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
x++;
if(d<0)
{
y++;
d+=UpIncre;
}
else d+=DownIncre;
}
}

else if((dy>(-dx))&&dy<0) //斜率-1<=k<=0的中点Bresenham算法
{ d=dx-2*dy;
UpIncre=-2*dy;
DownIncre=-2*dx-2*dy;
while(x<=x1)
{
glPointSize(3);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
x++;
if(d>0)
{
y--;
d+=DownIncre;
}
else d+=UpIncre;
} }
else if(dy<(-dx)) //斜率k<-1中点Bresenham算法
{d=-dy-2*dx;
UpIncre=2*dx+2*dy;
DownIncre=2*dx;
while(y>=y1)
{
glPointSize(3);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
y--;
if(d<0)
{
x++;
d-=UpIncre;
}
else d-=DownIncre;
} }

else //斜率k>1和k不存在时的的中点Bresenham算法
{ d=dy-2*dx;
UpIncre=2*dy-2*dx;
DownIncre=-2*dx;
while(y<=y1)
{
glPointSize(3);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
y++;
if(d<0)
{
x++;
d+=UpIncre;
}
else d+=DownIncre;
} }

}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口
glColor3f(1.0f, 0.0f, 0.0f); //设置当前的绘图颜色为红色
LineMidPointBre(1,1,1,-5); //调用中点Bresenham算法实现直线的扫描转换

glFlush(); //处理所有的OpenGL程序
}

int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式
glutInitWindowSize(360,360); //设置窗口的尺寸
glutInitWindowPosition(270,270); //设置窗口的位置
glutCreateWindow("中点Bresenham算法绘制任意斜率直线"); //设置标题
glutDisplayFunc(Display); //设置当前窗口的显示回调函数
Initial(); //完成窗口初始化
glutMainLoop(); //启动主GLUT事件处理循环
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
江西蓝天学院和赣江职业技术学院哪个好? 江西有什么好的中专学校 什么是单点登录(SSO),以及单点登录的实现流程 前端实现单点登录(SSO) 前端单点登录如何实现 面试官:来说说单点登录的三种实现方式 为什么很多人不买哈弗H9 座机如何开通国内长途 座机如何申请 辽宁省出租车手续怎么办? 求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较. 刚接触不太懂,请问各位我在mac上装了github for mac,还需要装git吗 lcd Bresenham算法画直线疑问代码e=dy-dx/2;是什么意思? Bresenham算法编写直线的程序怎么写啊!!Java学的不好…………这作业惨烈 关于Bresenham算法的求助 Bresenham直线演算法的最佳化 直线bresenham算法基于什么思路 Bresenham直线演算法的一般化 Bresenham直线演算法的介绍 Bresenham直线演算法的演算方法 共享充电宝成本怎么样 共享充电宝成本分析 共享充电宝财务怎么面试 深圳是谁开发的? 共享充电宝有没有税收这项要求 您好,公司购入一批共享充电宝,金额很大,靠这个收租金,请问一下购进的充电宝该如何入账比较好呢? 是不是深圳是靠香港发展? 改革开发33年了 ,有谁晓得 深圳是用什么打造起来的 ,深圳刚开始开发的时候是用什么模式打造的? 当年上海,深圳,天津的开发用的什么模式 深圳是如何开发的 深圳的开发是靠走私和股票发展起来的吗 在直线Bresenham生成算法中,确定y的值取yi+1,还是yi的依据是 写出直线段扫描转换的Bresenham算法,并生成从点P1(0,0)到点P2 (5,2)的直线段,要求写出每一步递推过程 我的华为荣耀30手机为啥没有HD开关。荣耀301。。荣耀30i设置里没有高清通话软件? 免费通话软件 那个通话清晰的 这个壁纸名字叫什么? 求这张壁纸原图及出处 最近我看新闻,看到说无代码平台,不用开发程序就能搭建系统,我想试试? 2厘亚克力板介刀能切吗 求这张壁纸的原图,图片我删了 请给我这个桌面壁纸的原图,非常感谢! 前置摄像头模糊不清 二进制负数补码转为十进制还有意义吗 青青子衿青青子佩采用了什么手法表达了什么感情? 青青子衿,悠悠我心。呦呦鹿鸣,食野之苹,我有嘉宾,鼓瑟吹笙。运用了哪些表现手法?表达了什么情感 青青子衿,悠悠我心诗句属于哪种类型,以及在表达作者思想情感上所起的作用? 在Excel中输入身份证号码为什么不能正确显示?后面的数字有三位变成0了? 为什么我老是被静电打到? 发卡要用什么洗‘ 洁净如新! 可以用食盐水浸泡吗? 小雏菊发卡怎么清洗 台风闭园,上海迪士尼竟然不退票!有哪些店大欺客的例子?