① 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;
}
}
}