① c語言中如何用line畫一個圓
#include <math.h>
#include <graphics.h> /*預定義庫函數*/
void circlePoint(int x,int y) /*八分法畫圓程序*/
{
circle(320+x*20,240+y*20,3);
circle(320+y*20,240+x*20,3);
circle(320-y*20,240+x*20,3);
circle(320-x*20,240+y*20,3);
circle(320-x*20,240+y*20,3);
circle(320-x*20,240-y*20,3);
circle(320-y*20,240-x*20,3);
circle(320+y*20,240-x*20,3);
circle(320+x*20,240-y*20,3);
}
void MidBresenhamcircle(int r) /* 中點Bresenham演算法畫圓的程序 */
{
int x,y,d;
x=0;y=r;d=1-r; /* 計算初始值 */
while(x<y)
{ circlePoint(x,y); /* 繪制點(x,y)及其在八分圓中的另外7個對稱點 */
if(d<0) d+=2*x+3; /* 根據誤差項d的判斷,決定非最大位移方向上是走還是不走 */
else
{ d+=2*(x-y)+5;
y--;
}
x++;
delay(900000);
} /* while */
}
main()
{
int i,j,r,graphmode,graphdriver;
detectgraph(&graphdriver,&graphmode); initgraph(&graphdriver,&graphmode," ");
printf("中點Bresenhamcircle演算法畫圓的程序\n"); /*提示信息*/
printf("注意 |r|<=11");
printf("\n輸入半徑值 r:");
scanf("%d",&r);
printf("按任意鍵顯示圖形...");
getch(); cleardevice(); setbkcolor(BLACK);
for(i=20;i<=620;i+=20) /*使用雙循環畫點函數畫出表格中的縱坐標*/
for(j=20;j<=460;j++)
putpixel(i,j,2);
for(j=20;j<=460;j+=20) &n歡迎光臨學網,收藏本篇文章 [1] [2]
$False$
bsp; /*使用雙循環畫點函數畫出表格中的橫坐標*/
for(i=20;i<=620;i++)
putpixel(i,j,2); outtextxy(320,245,"0"); /*原點坐標*/
outtextxy(320-5*20,245,"-5");circle(320-5*20,240,2); /*橫坐標值*/
outtextxy(320+5*20,245,"5");circle(320+5*20,240,2);
outtextxy(320-10*20,245,"-10");circle(320-10*20,240,2);
outtextxy(320+10*20,245,"10");circle(320+10*20,240,2);
outtextxy(320-15*20,245,"-15");circle(320-15*20,240,2);
outtextxy(320+15*20,245,"15");circle(320+15*20,240,2);
outtextxy(320,240-5*20,"-5");circle(320,240-5*20,2); /*縱坐標值*/
outtextxy(320,240+5*20,"5");circle(320,240+5*20,2);
outtextxy(320,240-10*20,"-10");circle(320,240-10*20,2);
outtextxy(320,240+10*20,"10");circle(320,240+10*20,2);
outtextxy(20,10,"The center of the circle is (0,0) "); /*坐標軸左上角顯示提示信息*/
setcolor(RED); /*標記坐標軸*/
line(20,240,620,240); outtextxy(320+15*20,230,"X");
line(320,20,320,460); outtextxy(330,20,"Y");
setcolor(YELLOW);
MidBresenhamcircle(r);
setcolor(BLUE); /*繪制圓*/
circle(320,240,r*20);
setcolor(2);
getch(); closegraph();
}
② 求計算機圖形學的中點畫拋物線詳細演算法,已經每一步實現的功能,最好能說一下思想。謝謝!
拋物線是指平面內到一個定點F(焦點)和一條定直線l(准線)距離相等的點的軌跡。它有許多表示方法,例如參數表示,標准方程表示等等。 它在幾何光學和力學中有重要的用處。 拋物線也是圓錐曲線的一種,即圓錐面與平行於某條母線的平面相截而得的曲線。二次函數的圖像就是一條拋物線,它是一個軸對稱圖形。拋物線與對稱軸的交點叫做拋物線的頂點。拋物線即把物體拋擲出去,落在遠處地面,這物體在空中經過的曲線。
平面內,到定點與定直線的距離相等的點的軌跡叫做拋物線。其中定點叫拋物線的焦點,定直線叫拋物線的准線。當拋物線的頂點為原點時,拋物線有以下特徵:
①原點在拋物線上;
②對稱軸為坐標軸;
③准線與對稱軸垂直,垂足與焦點分別對稱於原點,它們與原點的距離都等於一次項系數的絕對值的1/4。
對稱軸為x軸時,方程右端為±2px,方程的左端為y^2;對稱軸為y軸時,方程的右端為±2py,方程的左端為x^2;開口方向與x軸(或y軸)的正半軸相同時,焦點在x軸(y軸)的正半軸上,方程的右端取正號;開口方向與x(或y軸)的負半軸相同時,焦點在x軸(或y軸)的負半軸上,方程的右端取負號。
拋物線的弦是連接拋物線上任意兩點的線段。
拋物線的焦弦是經過拋物線焦點的弦。
拋物線的直徑是拋物線一組平行弦中點的軌跡。這條直徑也叫這組平行弦的共軛直徑。
希望我能幫助你解疑釋惑。
③ 圖形學中的中點畫線法與Bresenham演算法畫線的區別
在圖形學中,中點畫線法與Bresenham演算法畫線的主要區別在於決策參數的計算方式。Bresenham演算法的核心在於決定下一個點是在(x0+1,y0)還是(x0+1,y0+1)處。計算過程中,假設我們從點(x0,y0)開始,需要計算點(x0+1,y0)和點(x0+1,y0+1)與直線的垂直距離,分別記為p1和p2。決策參數p定義為p2-p1,依據p的正負值決定下一個點的選擇。
相比之下,中點畫線法的決策參數是基於直線方程的。假設我們想要畫的直線方程為y=kx+b,那麼決策參數p可以通過中點坐標代入直線方程計算得出。具體來說,對於兩個點(x0+1,y0)和(x0+1,y0+1),我們計算它們的中點(x0+1,y0+0.5)並代入直線方程,得到p的值。然後根據p的正負值判斷中點是否在直線上或其一側,從而決定繪制哪個點。
值得注意的是,中點畫線法最初主要用於繪制圓,它通過計算中點與圓心的距離來決定點的選擇,這使得中點畫線法在繪制圓時表現得更為高效和精確。盡管中點畫線法的原理與Bresenham演算法類似,但具體實現上的差異在於決策參數的選擇和計算方式的不同。
綜上所述,中點畫線法與Bresenham演算法在決策參數的計算上有顯著區別。Bresenham演算法側重於直線的垂直距離差,而中點畫線法則基於直線方程的中點距離。這種差異使得它們在不同的應用場景中展現出各自的優劣。
④ 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;
}
}
}