c语言画o型网格,C语言使用Bresenham算法生成直线(easyx图形库)分享!

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

其原理是:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。

Bresenham算法也是一种计算机图形学中常见的绘制直线的算法,其本质思想也是步进的思想,但由于避免了浮点运算,相当于DDA算法的一种改进算法。

270f017a5d180a88ecbffa65b762ad09.png

270f017a5d180a88ecbffa65b762ad09.png

270f017a5d180a88ecbffa65b762ad09.png

源代码展示:

#include #include #include #include #define x0 400 //定义全局变量x0,y0:坐标轴中心(x0,y0) #define y0 300 void Bresenham(int x1, int y1, int x2, int y2) { int x, y, dx, dy, p1, i; dx = x2 - x1; dy = y2 - y1; if (abs(dx) > abs(dy)) //斜率绝对值在(0,1),步进方向为x轴 { if (x1 < x2) //默认画点从左往右画 { x = x1; y = y1; } else { x = x2; y = y2; } putpixel(x + x0, y0 - y, RED); Sleep(50); p1 = 2 * abs(dy) - abs(dx); //计算初始pi的值 for (i = min(x1, x2); i < max(x1, x2); i++) { x = x + 1; if (p1 >= 0) { if (dx*dy >= 0) y = y + 1; else y = y - 1; //若Pi>=0,y(i+1)=y(i)±1 p1 = p1 + 2 * (abs(dy) - abs(dx)); //更新pi } else { y = y; //若Pi<0,y(i+1)=y(i) p1 = p1 + 2 * abs(dy); //更新pi } putpixel(x + x0, y0 - y, RED); Sleep(50); } } else { if (y1 < y2) { //步进方向为y轴,默认画点从下往上画 x = x1; y = y1; } else { x = x2; y = y2; } putpixel(x + x0, y0 - y, RED); Sleep(50); p1 = 2 * abs(dx) - abs(dy); for (i = min(y1, y2); i < max(y1, y2); i++) { y = y + 1; if (p1 >= 0) { if (dx*dy >= 0) //判断x方向是增加还是减少,很关键 x = x + 1; else x = x - 1; p1 = p1 + 2 * (abs(dx) - abs(dy)); } else { x = x; p1 = p1 + 2 * abs(dx); } putpixel(x + x0, y0 - y, RED); Sleep(50); } } } void main() { int x1, x2, y1, y2; printf("请输入两个整数点的坐标(x1,y1),(x2,y2)n"); scanf("%d %d %d %d", &x1, &y1, &x2, &y2); initgraph(800, 600); //初始化图形窗口大小 setbkcolor(WHITE); cleardevice(); setcolor(BLACK); line(0, y0, x0 * 2, y0); //坐标轴X line(x0, 0, x0, y0 * 2); //坐标轴Y Bresenham(x1, y1, x2, y2); //Bresenham画线算法 _getch(); //等待一个任意输入结束 closegraph(); //关闭图形窗口 }

结果显示:

270f017a5d180a88ecbffa65b762ad09.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

—-想了解C语言使用Bresenham算法生成直线(easyx图形库)分享!全部内容且更多的C语言教程关注

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/484680.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值