精华内容
下载资源
问答
  • 中点算法画圆

    2020-04-13 17:14:04
    R=100; x1=0;... % 中点在园内,应该取上面那个点 % 代表d>0 中点在圆外,应该取下面那个点 while x<y if d(n)<0 x(n+1) = x(n)+1; y(n+1) = y(n); d(n+1) = d(n)+2*x(n)+3; else ...
    R=100;
    x1=0;
    y1=R;
    d(1)=1-R;
    x(1)=x1;
    y(1)=y1;
    n=1;
     % 中点在园内,应该取上面那个点
     % 代表d>0 中点在圆外,应该取下面那个点
    while x<y
      if d(n)<0
        x(n+1) = x(n)+1;
        y(n+1) = y(n);
        d(n+1) = d(n)+2*x(n)+3;
      else
          x(n+1)=x(n)+1;
          y(n+1)=y(n)-1;
          d(n+1)=d(n)+2*(x(n)-y(n))+5;
      end
      n=n+1;  
    end
    
    % 使用循环 画 一 二 三 四象限
    for j =1:8
      if j==1
        for i = 1:n
          plot(x, y);
        end
        for i=1:n
          x2=y;
          y2=x;
        end
        elseif j==2
          % 
          for i=1:n
            plot(x2,y2);
          end
          for i=1:n
            x3=-y;
            y3=x;
          end
          % 
        elseif j==3
          % 
          for i=1:n
            plot(x3,y3)
          end
          for i=1:n
            x4=-x;
            y4=y;
          end
          % 
        elseif j==4
          % 
          for i=1:n
            plot(x4,y4)
          end
          for i=1:n
            x5=-x;
            y5=-y;  
          end
          % 
        elseif j==5
          % 
          for i=1:n
            plot(x5,y5)
          end
          for i=1:n
            x6=-y;
            y6=-x;  
          end
          % 
        elseif j==6
          % 
          for i=1:n
            plot(x6,y6)
          end
          for i=1:n
            x7=y;
            y7=-x;  
          end
          % 
        elseif j==7
          % 
          for i=1:n
            plot(x7,y7)
          end
          for i=1:n
            x8=x;
            y8=-y;  
          end
          % 
        elseif j==8
          % 
          for i=1:n
            plot(x8,y8)
          end
          % 
      end
      hold on;
    end 
    

    得到结果:
    在这里插入图片描述

    展开全文
  • 使用中点算法画圆 ················································
  • 画线 DDA BLINE 中点算法 画圆 圆弧
  • 中点算法画圆代码.rar

    2010-04-09 14:49:25
    计算机图形学 中点算法画圆代码 自己写的,画圆,希望对大家有帮助...
  • 中点算法画圆和直线

    2013-05-10 15:59:34
    计算机图形学用DDA和中点算法实现画直线,用中点算法和多边形逼近算法实现画圆
  • 为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。 圆心位于原点的圆有四条对称轴x=0,y=0,x=y...
     为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。
          圆心位于原点的圆有四条对称轴x=0,y=0,x=y和x=-y,从而圆上一点(x,y),可得到其关于四条对称轴的七个对称点,这称为八对称性,下面的函数就用来显示(x,y)及其七个对称点.
    200772802.jpg
    void CirclePoints(int x,int y,long color,CDC *pDC)

    {

               //第1象限

               pDC->SetPixel(x,y,color);

               pDC->SetPixel(y,x,color);

               //第2象限

               pDC->SetPixel(-x,y,color);

               pDC->SetPixel(-y,x,color);

               //第3象限

               pDC->SetPixel(-y,-x,color);

               pDC->SetPixel(-x,-y,color);

               //第4象限

               pDC->SetPixel(x,-y,color);

               pDC->SetPixel(y,-x,color);

    }


    中点画圆算法就是每部单位间隔取样并且计算离圆最近的位置。在继续之前,我这里补充一个关于圆对称性的知识点,通过在圆中计算考虑使用对称性计算开销可以减小到原来的1/8。对称性质原理:
    (1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;
    (2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;
    (3)圆是满足y = x or y = -x轴对称的,这样只需要计算原来的1/2点的位置;
    通过上面三个性质分析得知,对于元的计算只需要分析其中1/8的点即可。
    例如:分析出来目标点(x,y)必然存在(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)的另外7个点。
    关于中心画圆算法,通过计算x = 0到 x = y的1/8圆的范围,然后通过对称原理得到其他7/8个点的信息。
    这里和Bresenham算法有很多相似之处,同样有一个决定下一个位置的关键值P来做权衡处理。
    在中点画圆算法中,通过平移的方法将假设圆心在坐标原点,然后计算,最后再平移到真实原心位置。
     
    如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:
    d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2
    若 d<0,则应取P1为下一象素,而且再下一象素的判别式为:
    d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3
    若d≥0,则应取P2为下一象素,而且下一象素的判别式为
    d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5
    我们这里讨论的第一个象素是(0,R),判别式d的初始值为:
    d0=F(1,R-0.5)=1.25-R
    200772803.jpg
    中点画圆算法内容:
    1,输入圆心位置和圆的半径,得到圆周上的第一个点Point1;
    (假设起始点为坐标原点,后面将通过坐标平移来处理非圆心在圆点)
    2,计算决策关键参数的初始值,P = 5/4 - r;
    3,在每个Xn的位置,从n = 0开始,更具决策值P来判断:
        如果P<0,下一个点的位置为(Xn+1,Yn);
           并且执行P = P + 2*x+3;
        如果P>=0,下一个点的位置为(Xn+1,Yn-1);
           并且执行P = P + 2.0*(x-y)+5;
    4,通过对称原理计算其他7个对称相关点;
    5,移动坐标到圆心点(x1,y1)
          X = X + x1;
          Y = Y + y1;
    6,如果X<Y重复执行3到5的步骤,否则结束该算法
    程序如下:
    void Circle::Draw(CDC *pDC)
    {//中点算法画圆
        int x,y;
        double p;
        pDC->SetViewportOrg(pMid);
        x=0;
        y=radis;
        p=1.25-radis;
        while(x<=y+1)
        {
            CirclePoints(x,y,m_lPenColor,pDC);
            x++;
            if(p>=0)
            {
                y--;
                p+=2.0*(x-y)+5;
            }
            else
                p+=2*x+3;
        }
        pDC->SetViewportOrg(0,0);
    }

    200772801.jpg

    源代码下载

    PS:程序中还有很多bug,画圆的时候鼠标拖拽出的橡胶线和圆的实际半径大小不一致,画直线的两种算法在重绘的时候还有问题,郁闷呀,虚心求教。。。。

    本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/07/28/834407.html,如需转载请自行联系原作者
    展开全文
  • 受之前moveto和lineto方法动态画圆的启发,我想用中点算法来动态画圆,可是画出来结果如下图 [img=https://img-bbs.csdn.net/upload/201606/13/1465809020_167517.png][/img] 主要代码如下 void Circle(CDC *pDC,...
  • 为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。 圆心位于原点的圆有四条对称轴x=0,y=0,x=y...

      为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。

          圆心位于原点的圆有四条对称轴x=0,y=0,x=y和x=-y,从而圆上一点(x,y),可得到其关于四条对称轴的七个对称点,这称为八对称性,下面的函数就用来显示(x,y)及其七个对称点.

    void CirclePoints(int x,int y,long color,CDC *pDC)
    {
               //第1象限
               pDC->SetPixel(x,y,color);
               pDC->SetPixel(y,x,color);
               //第2象限
               pDC->SetPixel(-x,y,color);
               pDC->SetPixel(-y,x,color);
               //第3象限
               pDC->SetPixel(-y,-x,color);
               pDC->SetPixel(-x,-y,color);
               //第4象限
               pDC->SetPixel(x,-y,color);
               pDC->SetPixel(y,-x,color);
    }

    中点画圆算法就是每部单位间隔取样并且计算离圆最近的位置。在继续之前,我这里补充一个关于圆对称性的知识点,通过在圆中计算考虑使用对称性计算开销可以减小到原来的1/8。对称性质原理:

     

    (1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;

    (2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;

    (3)圆是满足y = x or y = -x轴对称的,这样只需要计算原来的1/2点的位置;

    通过上面三个性质分析得知,对于元的计算只需要分析其中1/8的点即可。

    例如:分析出来目标点(x,y)必然存在(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)的另外7个点。

    关于中心画圆算法,通过计算x = 0到 x = y的1/8圆的范围,然后通过对称原理得到其他7/8个点的信息。

    这里和Bresenham算法有很多相似之处,同样有一个决定下一个位置的关键值P来做权衡处理。

    在中点画圆算法中,通过平移的方法将假设圆心在坐标原点,然后计算,最后再平移到真实原心位置。

     

    如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:

    d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2

    若 d<0,则应取P1为下一象素,而且再下一象素的判别式为:

    d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3

    若d≥0,则应取P2为下一象素,而且下一象素的判别式为

    d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5

    我们这里讨论的第一个象素是(0,R),判别式d的初始值为:

    d0=F(1,R-0.5)=1.25-R

     

    中点画圆算法内容:

    1,输入圆心位置和圆的半径,得到圆周上的第一个点Point1;

    (假设起始点为坐标原点,后面将通过坐标平移来处理非圆心在圆点)

    2,计算决策关键参数的初始值,P = 5/4 - r;

    3,在每个Xn的位置,从n = 0开始,更具决策值P来判断:

        如果P<0,下一个点的位置为(Xn+1,Yn);

           并且执行P = P + 2*x+3;

        如果P>=0,下一个点的位置为(Xn+1,Yn-1);

           并且执行P = P + 2.0*(x-y)+5;

    4,通过对称原理计算其他7个对称相关点;

    5,移动坐标到圆心点(x1,y1)

          X = X + x1;

          Y = Y + y1;

    6,如果X<Y重复执行3到5的步骤,否则结束该算法

    程序如下:

    void Circle::Draw(CDC *pDC)
    {//中点算法画圆
        int x,y;
        double p;
        pDC->SetViewportOrg(pMid);
        x=0;
        y=radis;
        p=1.25-radis;
        while(x<=y+1)
        {
            CirclePoints(x,y,m_lPenColor,pDC);
            x++;
            if(p>=0)
            {
                y--;
                p+=2.0*(x-y)+5;
            }
            else
                p+=2*x+3;
        }
        pDC->SetViewportOrg(0,0);
    }

    源代码下载

    原文地址:http://www.cnblogs.com/phinecos/archive/2007/07/28/834407.html

     

    转载于:https://www.cnblogs.com/mqxs/p/3591141.html

    展开全文
  • 中点画圆算法 计算机图形学 中点画圆算法 计算机图形学 中点画圆算法 计算机图形学 中点画圆算法 计算机图形学
  • 1完成坐标变换,将坐标原点移动到(400,400)处,并使X轴正方向水平向右,使Y轴正方向垂直向上; 2根据用户的选择输入的圆心坐标、半径、颜色,分别实现中点画圆算法和Bresenham算法画圆
  • 中点Bresenham算法画圆

    2012-12-09 19:30:04
    中点Bresenham算法画圆 mid_Bresenham_Cicle.cpp
  • java图形学中点扫描算法画圆的源代码
  • 上课做的作业,有报告,中点算法,Bresenham,vs2010,mfc的,希望对大家有帮助
  • 中点画圆的改进算法,中点画圆的改进算法,中点画圆的改进算法
  • 中点画圆算法

    2011-11-10 09:03:54
    中点画圆算法
  • 两个算法画圆实现的交互界面是在窗口上鼠标左键点击得到圆心,并在控制台界面输入圆的半径,点击右键画出圆,椭圆算法的交互界面是在窗口上点击椭圆中心,并在控制台界面输入长轴和短轴的长度,点击右键画出椭圆。
  • 3、编程实现利用DDA算法、中点算法和Bresenham算法生成直线,并显示。 同时要求:(1)实现可动态修改直线的起始点坐标和终点坐标 (2)实现可动态选择线的颜色和线宽。 4、编程实现利用1/8圆中点算法和Bresenham...
  • 【计算机图形学】中点画圆算法和Bresenham画圆算法

    万次阅读 多人点赞 2016-11-06 18:27:10
    中点画圆算法和Bresenham画圆算法

    在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2。在计算机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。为了简化,我们先考虑圆心在原点的圆的生成,对于中心不是原点的圆,可以通过坐标的平移变换获得相应位置的圆。

            在进行扫描转换之前,需要了解一个圆的特性,就是圆的八分对成性。如图(1)所示:

    图(1)圆的八分对称性

    圆心位于原点的圆有四条对称轴x = 0、y = 0、x = y和x = -y,若已知圆弧上一点P(x,y),就可以得到其关于四条对称轴的七个对称点:(x, -y)、(-x, y)、(-x, -y)、(y, x)、(y, -x)、(-y, x)、(-y, -x),这种性质称为八分对称性。因此只要能画出八分之一的圆弧,就可以利用对称性的原理得到整个圆。

     

    1、  中点画圆法

            考虑圆心在原点,半径为R的圆在第一象限内的八分之一圆弧,从点(0, R)到点(R' , R' )顺时针方向确定这段圆弧。假定某点Pi(xi, yi)已经是该圆弧上最接近实际圆弧的点,那么Pi的下一个点只可能是正右方的P1或右下方的P2两者之一,如图(2)所示:

    图(2)中点划线法示例

    构造判别函数:

     

    F(x, y)= x+ y– R2

     

    当F(x, y)= 0,表示点在圆上,当F(x, y)> 0,表示点在圆外,当F(x, y)< 0,表示点在圆内。如果M是P1和P2的中点,则M的坐标是(xi + 1, yi – 0.5),当F(xi + 1, yi – 0.5)< 0时,M点在圆内,说明P1点离实际圆弧更近,应该取P1作为圆的下一个点。同理分析,当F(xi + 1, yi – 0.5)> 0时,P2离实际圆弧更近,应取P2作为下一个点。当F(xi + 1, yi – 0.5)= 0时,P1和P2都可以作为圆的下一个点,算法约定取P2作为下一个点。

    现在将M点坐标(xi + 1, yi – 0.5)带入判别函数F(x, y),得到判别式d:

     

    d = F(xi + 1, yi – 0.5)= (xi + 1)2 + (yi – 0.5)2 – R2

     

    若d < 0,则取P1为下一个点,此时P1的下一个点的判别式为:

     

    d’ = F(xi + 2, yi – 0.5)= (xi + 2)2 + (yi – 0.5)2 – R2

     

    展开后将d带入可得到判别式的递推关系:

     

    d’ = d + 2xi + 3

     

    若d > 0,则取P2为下一个点,此时P2的下一个点的判别式为:

     

    d’ = F(xi + 2, yi – 1.5)= (xi + 2)2 + (yi – 1.5)2 – R2

     

    展开后将d带入可得到判别式的递推关系:

     

    d’ = d + 2(xi - yi) + 5

     

    特别的,在第一个象限的第一个点(0, R)时,可以推倒出判别式d的初始值d0

     

    d0 = F(1, R – 0.5) = 1 – (R – 0.5)2 – R2 = 1.25 - R

     

    根据上面的分析,可以写出中点画圆法的算法。考虑到圆心不在原点的情况,需要对计算出来的坐标进行了平移,下面就是通用的中点画圆法的源代码:

    26 void MP_Circle(int xc , int yc , int r)

    27 {

    28     int x, y;

    29     double d;

    30 

    31     x = 0;

    32     y = r;

    33     d = 1.25 - r;

    34     CirclePlot(xc , yc , x , y);

    35     while(< y)

    36     {

    37         if(< 0)

    38         {

    39             d = d + 2 * x + 3;

    40         }

    41         else

    42         {

    43             d = d + 2 * ( x - y ) + 5;

    44             y--;

    45         }

    46         x++;

    47         CirclePlot(xc , yc , x , y);

    48     }

    49 }

      参数xc和yc是圆心坐标,r是半径,CirclePlot()函数是参照圆的八分对称性完成八个点的位置计算的辅助函数。

    2  改进的中点画圆法-Bresenham算法

            中点画圆法中,计算判别式d使用了浮点运算,影响了圆的生成效率。如果能将判别式规约到整数运算,则可以简化计算,提高效率。于是人们针对中点画圆法进行了多种改进,其中一种方式是将d的初始值由1.25 – R改成1 – R,考虑到圆的半径R总是大于2,因此这个修改不会影响d的初始值的符号,同时可以避免浮点运算。还有一种方法是将d的计算放大两倍,同时将初始值改成3 – 2R,这样避免了浮点运算,乘二运算也可以用移位快速代替,采用3 – 2R为初始值的改进算法,又称为Bresenham算法:

    52 void Bresenham_Circle(int xc , int yc , int r)

    53 {

    54     int x, y, d;

    55 

    56     x = 0;

    57     y = r;

    58     d = 3 - 2 * r;

    59     CirclePlot(xc , yc , x , y);

    60     while(< y)

    61     {

    62         if(< 0)

    63         {

    64             d = d + 4 * x + 6;

    65         }

    66         else

    67         {

    68             d = d + 4 * ( x - y ) + 10;

    69             y--;

    70         }

    71         x++;

    72         CirclePlot(xc , yc , x , y);

    73     }

    74 }

    展开全文
  • 基于java的计算机图形学中点扫描算法画圆、已经运行通过
  • 图形学中的中点算法画圆,以下是该算法的 C 语言实现:///////////////////////////////////////////////////// 程序名称:基于中点算法画圆// 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版// 作 者:yangw...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 908
精华内容 363
关键字:

中点算法画圆