當前位置:首頁 » 操作系統 » 圓的bresenham演算法

圓的bresenham演算法

發布時間: 2022-07-06 03:11:17

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

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

㈡ bresenham演算法的原理

Bresenham演算法是計算機圖形學領域使用最廣泛的直線掃描轉換方法。
其原理是:
過各行、各列像素中心構造一組虛擬網格線,按直線從起點到終點的
順序計算直線各垂直網格線的交點,然後確定該列像素中與此交點最近
的像素。
該演算法的優點在於可以採用增量計算,使得對於每一列,只要檢查一個誤差項
的符號,就可以確定該列所求的像素。

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

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

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

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

㈣ bresenham法畫圓的C程序

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);

㈤ 哪位兄弟知道用Bresenham演算法畫圓,速度回下,謝咯~~~~

/* WIN-TC BGI 圖形編程模板 */

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
void Swap(int *a,int *b);
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) {
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);
}
else {
line(centerx+x, centery+y, centerx+x, centery-y);
line(centerx-x, centery+y, centerx-x, centery-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 = 2;
}
else {
direction = 3;
}
}
else {
direction=2;
}

switch(direction) {
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生成演算法為例,圖解矢量圖形和光柵圖形的區別

有電子藝術圖像被分為兩種核心類型:光柵圖像(也稱為「點陣圖」)和矢量圖像。簡而言之,光柵圖像由連接的點組成,矢量是由連接的線組成的圖像。這兩種格式彼此完全不同,但當適當地用於所需的最終輸出方法時,它們彼此形成對比和互補。光柵圖像通過掃描源圖稿或使用照片編輯或繪圖程序(如Corel、PhotoPAINT或Adobe PhotoShop)「繪畫」來創建,而矢量圖像是通過使用CorelDRAW或Adobe Illustrator等矢量插圖程序繪制的過程來創建的。


一、Bresenham演算法原理

由Bresenham提出的一種精確而有效的光柵線生成演算法,可用於顯示線、圓和其他曲線的整數增量運算。它是目前最有效的線段生成演算法。


推導:


設線段端點:(,),(,),∆x和∆y為水平和垂直偏移量,m為斜率



當|m| <= 1時,對於給定的x增量∆x



當|m| >= 1時,對於給定的y增量∆y,




(當 0<m < 1)


假設已經確定了要顯示的像素,那麼,需要確定下一點是繪制在,


還是。




根據直線的方程,直線上處的y坐標為:






將m帶入d1 – d2中,並變換得:



其中,為演算法中第k步的決策參數,c為一常量,其值為。


那麼:


若,即,有


若, 即,有


同理,可求得第k+1步的決策參數



因此,有如下遞推關系:



因為0<m<1 因此,帶入上式得:



其中,的值取決於的值:


當時,,


當時, ,


Bresenham演算法描述 (0 < m < 1)


演算法從線段的起始端點開始,反復計算每個點的決策參數並繪制像素。


起始端點處的決策參數為:






演算法:


1、輸入線段的兩個端點,並將左端點存儲在中;


2、將裝入幀緩沖器,畫出第一個點;


3、計算常量∆x,∆y,2∆y 和2∆y – 2∆x,並得到決策參數的第一個值:


4、從k = 0開始,在沿線的每個處,進行下列檢測:


若,下一個待畫點是,且


若 ,下一個待畫點是,且


5、重復步驟4,共∆x次。

————————————————

版權聲明:本文為CSDN博主「地澤萬物」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/qq_41883085/article/details/102706471

㈦ 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演算法的高手幫忙看下!

//包含頭文件這個不用我說了吧
#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點生成演算法,通常把圓分成__________個部分

圓弧的
Bresenham
點生成演算法,
通常把圓分成
ˍ
8
ˍ
個部分,
如果
f
i
=(x
i
+1)
2
+y
i
2
-R
2

g
i
=(x
i
+1)
2
+(y
i
-1)

2
-R
2

e=

f
i

-

g
i
∣,當點(
X
i

Y
i
)的
e
i

0

則下一點為
D
,其坐標為(
X
i
+1

ˍ
yi-1
ˍ
),

e
i

0


下一點為
H
,其坐標為
(X
i
+1

ˍ
yi

ˍ
)

㈩ 用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;
}

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

熱點內容
禮儀講話腳本大全視頻 發布:2024-11-18 20:17:44 瀏覽:709
c語言通訊錄程序設計 發布:2024-11-18 19:35:21 瀏覽:98
微信下載的圖片在哪個文件夾 發布:2024-11-18 19:23:06 瀏覽:358
我的世界查伺服器ip地址 發布:2024-11-18 19:23:04 瀏覽:212
電腦加裝存儲硬碟不影響速度吧 發布:2024-11-18 19:21:52 瀏覽:693
伴生氣壓縮機 發布:2024-11-18 19:21:40 瀏覽:878
javalinux環境變數設置 發布:2024-11-18 19:20:58 瀏覽:843
按存取方式來分主存儲器 發布:2024-11-18 19:20:55 瀏覽:223
安卓屏幕如何升級 發布:2024-11-18 19:01:19 瀏覽:479
磁碟密碼在哪裡看到 發布:2024-11-18 19:01:16 瀏覽:885