C語言使用Bresenham算法生成直線(easyx圖形庫)
Bresenham算法是計(jì)算機(jī)圖形學(xué)領(lǐng)域使用最廣泛的直線掃描轉(zhuǎn)換方法。
其原理是:過各行、各列像素中心構(gòu)造一組虛擬網(wǎng)格線,按直線從起點(diǎn)到終點(diǎn)的順序計(jì)算直線各垂直網(wǎng)格線的交點(diǎn),然后確定該列像素中與此交點(diǎn)最近的像素。
Bresenham算法也是一種計(jì)算機(jī)圖形學(xué)中常見的繪制直線的算法,其本質(zhì)思想也是步進(jìn)的思想,但由于避免了浮點(diǎn)運(yùn)算,相當(dāng)于DDA算法的一種改進(jìn)算法。



源代碼展示:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<conio.h>
#define x0 400 //定義全局變量x0,y0:坐標(biāo)軸中心(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),步進(jìn)方向?yàn)閤軸
{
if (x1 < x2) //默認(rèn)畫點(diǎn)從左往右畫
{
x = x1;
y = y1;
}
else
{
x = x2;
y = y2;
}
putpixel(x + x0, y0 - y, RED);
Sleep(50);
p1 = 2 * abs(dy) - abs(dx); //計(jì)算初始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)
{ //步進(jìn)方向?yàn)閥軸,默認(rèn)畫點(diǎn)從下往上畫
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方向是增加還是減少,很關(guān)鍵
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("請輸入兩個整數(shù)點(diǎn)的坐標(biāo)(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); //坐標(biāo)軸X
line(x0, 0, x0, y0 * 2); //坐標(biāo)軸Y
Bresenham(x1, y1, x2, y2); //Bresenham畫線算法
_getch(); //等待一個任意輸入結(jié)束
closegraph(); //關(guān)閉圖形窗口
}
結(jié)果顯示:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)進(jìn)程間通信原理解析
這篇文章主要介紹了C語言實(shí)現(xiàn)進(jìn)程間通信原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
C 程序?qū)崿F(xiàn)密碼隱秘輸入的實(shí)例 linux系統(tǒng)可執(zhí)行
下面小編就為大家?guī)硪黄狢 程序?qū)崿F(xiàn)密碼隱秘輸入的實(shí)例 linux系統(tǒng)可執(zhí)行。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Visual?Studio?2019?Qt?QML?項(xiàng)目環(huán)境搭建常見問題處理
本文主要介紹了Visual?Studio?2019?Qt?QML?項(xiàng)目環(huán)境搭建常見問題處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
C++中sprintf使用的方法與printf的區(qū)別分析
這篇文章主要介紹了C++中sprintf使用的方法與printf的區(qū)別,實(shí)例分析了sprintf與printf的具體用法及相關(guān)注意事項(xiàng),具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01
C++實(shí)現(xiàn)訪問者模式的基礎(chǔ)介紹
訪問者模式表示一個作用于某對象結(jié)構(gòu)中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。對C++訪問者模式相關(guān)知識感興趣的朋友一起看看吧2021-09-09
C/C++實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法
在C/C++程序中,會需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實(shí)現(xiàn)程序想要的效果,下面將介紹多種方法實(shí)現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-08-08

