圆的bresenham算法
㈠ 关于椭圆中点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;   
        }       
    
  这是直线的算法:和圆的差不多,你可以参考一下:)
