導航:首頁 > 源碼編譯 > 中點bresenham演算法畫圓

中點bresenham演算法畫圓

發布時間:2023-01-11 03:15:11

⑴ 圖形學中的中點畫線法與Bresenham演算法畫線的區別

個人認為最關鍵的區別就是那個決策參數的計算方式!
在Bresenham演算法中,假設我們在(x0,y0)處畫了一個點,那我們就要決定下一個點是在(x0+1,y0)還是在(x0+1,y0+1)處畫,這兩個點一般都不在直線上,我們要計算這兩個點離直線有多遠,分別設兩個點離直線的距離為p1、p2,然後決策參數就是p=p2-p1,再根據p的符號來判斷選擇哪個點
至於中點法,我沒有用它來畫過直線,只用來畫過圓(自我感覺畫圓用這個演算法比Bresenham演算法要好很多),但原理應該差不多!
在中點演算法中,決策參數的就是方式就是圓的方程(換成直線就是直線的方程了),比如要畫x^2+y^2=r^2的圓,那決策參數p=x^2+y^2-r^2,然後就不是代入上面找到的兩個點直接代進去,而是代這兩個點的中點進去,求出p的值,根據p的符號來判斷那個中點是在圓上、圓內還是圓外,再進一步決定選擇繪哪個點!
具體的計算過程沒辦法在這里完整演示,但個人認為不同之處還是在於決策參數的選擇與計算

⑵ 畫圓為什麼要用Bresenham演算法

演算法引入的本意是解決像素填充的問題的
點和線這種東西在理論上都是沒有寬度的,但是要在屏幕上繪制的時候就要去填充像素以形成痕跡
一行上經常有2個以上的像素都被線所貫穿, 如何填充是個問題

而且像素填充本身是使用非常頻繁的需求,故而畫線的演算法效率是非常重要的,對整個系統影響巨大

Bresenham演算法是通過增量計算的方式快速判別下一個行或者列上的要填充的像素的位置,從計算上來說非常的節省,幾乎都是整數的演算法,速度非常的快

⑶ 怎樣用C語言畫圓

#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
char arg[50]={0};
arg[0]= '\ " ';
strcpy(arg+1,argv[0]);
int len=int(strlen(arg));
arg[len]= '\ " ';

HWND hWnd=FindWindow(NULL,arg); //找到程序運行窗口的句柄
HDC hDC=GetDC(hWnd);//通過窗口句柄得到該窗口的設備場境句柄
HPEN hPen,hOldPen; //畫筆
int i=0;

for(;i <500;++i)
SetPixel(hDC,10+i,10+i,0x0000ff);//用畫點的辦法畫一根線,最後一個參數是顏色(32位)

hPen=CreatePen(PS_SOLID,2,0x00ff00);//生成綠色畫筆
hOldPen=(HPEN)SelectObject(hDC,hPen);//把畫筆引入設備場境

MoveToEx(hDC,20,50,NULL); //設置畫線起點
LineTo(hDC,520,550); //畫到終點

Arc(hDC,100,100,300,300,350,500,350,500);//畫圓

SelectObject(hDC,hOldPen);
ReleaseDC(hWnd,hDC);

//下面是對比,表明它確實是控制台程序

printf( "hello console ");
system( "pause ");
return 0;

}

⑷ C語言用Bresenham演算法畫圓,哪位高手教教,主要是演算法里的內容,謝謝!

的確哈,關鍵在於對delta的理解
可以看到,都是delta=2*(1-radius)這樣的,起作用應該是判斷要畫的點x、y坐標的變化趨勢,先把我注釋了的代碼貼下,加了getch();可以看到畫的過程
-----------------------------------------------------------------
#include<graphics.h>
#include<stdio.h>

void BresenhemCircle(int centerx, int centery, int radius, int color, int type);

void main()
{
int drive=DETECT,mode;
int i,j;
initgraph(&drive,&mode,"");
BresenhemCircle(300,200,100,15,0);
getch();
}

void BresenhemCircle(int centerx, int centery, int radius, int color, int type)
{
int x =type = 0;/*初始橫坐標為原點*/
int y = radius; /*初始縱坐標遠離原點*/
int delta = 2*(1-radius);
int direction;
while (y >= 0)
{
getch();
if (!type)/*執行*/
{
/*在上半圓畫兩點*/
putpixel(centerx+x, centery+y, color);
putpixel(centerx-x, centery+y, color);
/*在下半圓畫兩點*/
putpixel(centerx-x, centery-y, color);
putpixel(centerx+x, centery-y, color);
getch();
}
else/*不執行*/
{
line(centerx+x, centery+y, centerx+x, centery-y);
line(centerx-x, centery+y, centerx-x, centery-y);
getch();
}
/*以下代碼設置下次四點的位置,圓是對稱的,且此方法相當於同時畫四個圓弧
觀察右上方圓弧可知,前一半是x增的要快些,後一半是y減的快些*/
if (delta < 0)
{
if ((2*(delta+y)-1) < 0)
direction = 1; /*選擇橫向加*/
else
direction = 2;
}
else if(delta > 0)
{
if ((2*(delta-x)-1) > 0)
direction = 3; /*選擇縱向減*/
else
direction = 2;
}
else
direction=2;

switch(direction)
{
case 1:
x++;/*只橫坐標遠離原點*/
delta += (2*x+1); /*小執行到這,所以加*/
break;
case 2:
x++;
y--;/*橫向遠離,同時縱向靠近*/
delta += 2*(x-y+1); /*即(2*x+1)+(-2*y+1)*/
break;
case 3:
y--;/*只縱坐標靠近原點*/
delta += (-2*y+1); /*大執行到這,所以減*/
break;
}
}
}

⑸ 用C實現Bresenham演算法生成直線和圓的程序(要求具體步驟有必要解述)

Bresenham演算法生成直線
假定直線從(x1,y1)到(x2,y2),
令dx=x2-x1,dy=y2-y1
不妨設(dx,dy)在第一象限,並且直線的斜率不大於1

畫線過程中有三個循環變數
x,y,d
初值
x=x1,y=y1,d=2*dy-dx

循環,直到x==x2為止
{
如果d>=0,y++,d+=2*(dy-dx)
如果d<0 ,x++,d+=2*dy
}

如果(dx,dy)不在第一象限,要做變換,即先把第一象限的畫出來
如果斜率大於1,x,y交換

非常簡單的,很容易實現
圓的演算法:

int Bres(int x0,int y0,double r,int color)

{
int x,y,d;
x=0;
y=(int)r;
d=(int)(3-2*r);
while(x<y)
{
cirpot(x0,y0,x,y,color);
if(d<0)
d+=4*x+6;
else
{
d+=4*(x-y)+10;
y--;
}
x++;
}
if(x==y)
cirpot(x0,y0,x,y,color);
return(0);
}
int cirpot(int x0,int y0,int x,int y,int color)
{
setcolor(color);
putxicl((x0+x),(y0+y));
putxicl((x0+y),(y0+x));
putxicl((x0+y),(y0-x));
putxicl((x0+x),(y0-y));
putxicl((x0-x),(y0-y));
putxicl((x0-y),(y0-x));
putxicl((x0-y),(y0+x));
putxicl((x0-x),(y0+y));
setcolor(color);
return(0);
}

這是圓的演算法,你若要整個程序,把你的電郵給我,我給你發過去、
運行環境是Turboc 2.0
int Bresline(int x1,inty1,int x2,int y2,int color)
{
int color,itag;
int dx,dy,tx,ty,inc1,inc2,d,curx,cury;
setcolor(color);
putxicl(x1,y1);
if(x1==x2&&y1==y2)
{
setcolor(color);
return(1);
}
itag=0;
dx=abs(x2-x1);
dy=abs(y2-y1);
if(dx<dy)
{
itag=1;]
iswap(&x1,&y1);
iswap(&x2,&y2);
iswap(&dx,&dy);
}
tx=(x2-x1)>0? 1:-1;
ty=(y2-y1)>0? 1:-1;
curx=x1;
cury=y1;
inc1=2*dy;
inc2=2*(dy-dx);
d=inc1-dx;
while(curx!x2)
{
if(d<0)
{
d+=inc1;
}
else
{
cury+=ty;
d+=inc2;
}
if(itag)
setpixel(cury,curx);
else
setpixel(curx,cury);
curxd+=tx;
}
setcolor(color);
return(0);
}
iswap(int*a,int*b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}

這是直線的演算法:和圓的差不多,你可以參考一下:)

⑹ 關於橢圓中點Bresenham演算法,請教高手,急用!分暫時不夠,夠了之後一定補上,謝謝各位了!

Bresenham演算法;
多邊形迫近法—圓與橢圓
...
推導出圓弧的增量演算法的表達式:
缺點:所產生的圓是不封閉的,且該圓的半徑有不斷增大的趨勢。

⑺ 四道圖像圖像演算法題目

取X=0時,在Y軸上畫點1。
取Y=0時,在X軸上畫點2。
畫直線通過兩點。
你畫的X=0時,Y是幾?自己數手指頭去。

⑻ 會用C語言畫圖的(圓)Bresenham演算法的高手幫忙看下!

//包含頭文件這個不用我說了吧
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
//交換a,b的值函數
void Swap(int *a,int *b);
//Bresenhen畫園函數,圓心坐標(centerx,centery)半徑radius線條顏色color
void BresenhemCircle(int centerx, int centery, int radius, int color, int type);
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同樣效果 */
registerbgidriver(EGAVGA_driver);/* 注冊BGI驅動後可以不需要.BGI文件的支持運行 */
initgraph(&gd, &gm, "");//初始化圖形,必須寫的
setbkcolor(WHITE);//設置背景顏色
}

int main(void)
{
int centerx,centery,radius,color,type;//變數定義總該知道的吧
printf("centerx,centery\n");//輸出提示信息,這個總該知道的吧
scanf("%d",¢erx);//輸入中心坐標橫坐標
scanf("%d",¢ery);//
printf("radius\n");
scanf("%d",&radius);
printf("color,type\n");
scanf("%d",&color);
scanf("%d",&type);
initgr(); /*BGI初始化 */
BresenhemCircle(centerx,centery,radius,color,type);//重點理解這個函數
/*setcolor(RED);
circle(centerx, centery,radius);*/
/*Swap(&xs,&xe);
printf("%d,%d",xs,xe); */
getch();
closegraph();
}

void BresenhemCircle(int centerx, int centery, int radius, int color, int type)
{
int x =type= 0;//這些賦值語句應該能夠看懂的吧
int y = radius;
int delta = 2*(1-radius);
int direction;
while (y >= 0) {//循環,如果y>=0就繼續執行{}裡面的語句
if (!type) { //!type表示如果type=0就執行{}裡面的語句
putpixel(centerx+x, centery+y, color);
//前面兩個參數是坐標,後面一個是顏色值,在(centerx+x, centery+y)畫一個點
putpixel(centerx-x, centery+y, color);
putpixel(centerx-x, centery-y, color);
putpixel(centerx+x, centery-y, color);
}
else {//如果type=1就執行下面的
line(centerx+x, centery+y, centerx+x, centery-y);
line(centerx-x, centery+y, centerx-x, centery-y);
}
if (delta < 0) {//這個類似上面的,只不過這個嵌套了一層if-else if-else
if ((2*(delta+y)-1) < 0) {
direction = 1;
}
else {
direction = 2;
}
}
else if(delta > 0) {
if ((2*(delta-x)-1) <= 0) {
direction = 2;
}
else {
direction = 3;
}
}
else {
direction=2;
}

switch(direction) {//選擇如果direction=1執行case 1:到case 2:直接的語句,如果沒有break那麼case 2:下面的語句也會被執行
case 1:
x++;
delta += (2*x+1);
break;
case 2:
x++;
y--;
delta += 2*(x-y+1);
break;
case 3:
y--;
delta += (-2*y+1);
break;
}

}
}

閱讀全文

與中點bresenham演算法畫圓相關的資料

熱點內容
程序員老闆用什麼手機 瀏覽:848
比心app頭像不通過為什麼 瀏覽:105
加密幣市值前十走勢 瀏覽:190
單片機學習推薦課程 瀏覽:473
對數ln的運演算法則圖片 瀏覽:735
仿微博app源碼 瀏覽:781
怎麼取消調用app 瀏覽:545
程序員去哪裡求助 瀏覽:834
伺服器里的埠是什麼 瀏覽:975
aspnetjavaphp 瀏覽:399
程序員畢業時間 瀏覽:285
程序員用戶免費軟體 瀏覽:754
51單片機匯編語言指令 瀏覽:139
女程序員好難 瀏覽:688
三田壓縮機與電裝 瀏覽:710
重生細胞安卓版沒鍵盤怎麼玩 瀏覽:994
小米nfc手機刷加密卡 瀏覽:290
linux如何下載文件 瀏覽:808
linuxrpm依賴 瀏覽:370
匯率pdf 瀏覽:353