计算机图形学-二维图形生成算法

Posted 修心_666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机图形学-二维图形生成算法相关的知识,希望对你有一定的参考价值。

直线图形

  绘制直线段一般需要进行栅格化(又叫光栅化)处理:将几何数据经过一系列变换后转换为像素呈现在显示设备上。

  数值微分算法(DDA)

  数值微分算法本质为用数值方法解微分方程,即通过同时对x和y个增加一个小增量,计算下一步的x,y的值。

  1.DDA的推导公式

  2.DDA画线程序设计

void Line_DDA (CDC *pDC,int xs,int ys,int xe,int ye, COLORREF color)

    int t; float x,y,k=(float)(ye-ys)/(xe-xs);
	if( fbs(k) < 1)
        if(xe<xs)
          t=xe,xe=xs,xs=t,t=ye,ye=ys,ys=t;
      	    
	    y=ys;    
    	for(x=xs;x<=xe;x++)
        	pDC->SetPixel(x,y,color), y=y+k;
    else
        if(ye<ys)
            t=xe,xe=xs,xs=t,t=ye,ye=ys,ys=t;
        
        x=xs;    
        for(y=ys;y<=ye;y++)
        	pDC->SetPixel(x,y,color),x=x+1/k;
  	

  3.控制线型的程序设计思路

  4.反走样处理

  用离散量表示连续量引起的图形失真,叫走样;减少走样现象的技术和方法称为反走样。

  反走样处理:

  中点画线法

  1.基本原理

  2.中点法的递推公式

  3.任意方向上的中点法

  4.中点法程序设计


  5.直线段的线宽处理

  1) 垂直线刷子:适用于直线斜率在[-1, 1]之间。把线刷子放置成垂直方向,刷子中点对准直线 一端点,然后让刷子中心往直线的另一端移动,即可“刷出”具有一定宽度的线段。

CDC *pDC=GetDC();   
dx=xe-xs; dy=ye-ys;   //( xs,ys),(xe,ye)为直线段的两个端点坐标 
e=-dx; y=ys; dxx=dx+dx; dyy=dy+dy; 
for(x=xs;x<=xe;x++) 
    pDC->SetPixel(x,y,RGB(0,0,0));   
    pDC->SetPixel(x-1,y,RGB(0,0,0));      
    pDC->SetPixel(x+1,y,RGB(0,0,0));   
    if(e>=0)    
        y=y++, e=e-dxx;   e=e+dyy; 

  2) 水平线刷子:适用于直线斜率不在[1, 1]之间。把线刷子放置成水平方向,刷子中点对准直 线一端点并往直线的另一端移动,可“刷出”具有一定宽度的线。

  3)方形刷子:把正方形(边宽为指定线宽)的中心沿直线做平行移动,即可获得具有线宽的线条。

圆与椭圆图形

  简单方程产生园弧

  

  1.绘制圆函数的程序设计

void Arc_Para(CDC *pDC,int xc,int yc,int r,COLORREF color)
 
    int x,y;float d=1/(2*3.14*r);
	for(float t=0;t<6.283;t=t+d)
	
        x=x0+r*cos(t);
	    y=y0+r*sin(t);
        pDC->SetPixel (x,y,color);
	

  中点画圆算法

  1.基本原理

  2.程序设计:

void Circle_DDA(CDC *pDC,int x0,int y0,int r,COLORREF color)

    int  x=0, y=r, d=1-r;  
	while( y>=x )       
	    pDC->SetPixel (x+x0,y+y0,color);
        pDC->SetPixel (-x+x0,y+y0,color);
        pDC->SetPixel (-x+x0,-y+y0,color); 
        pDC->SetPixel (x+x0,-y+y0,color);
        pDC->SetPixel (y+x0,x+y0,color);        
        pDC->SetPixel (-y+x0,x+y0,color);
        pDC->SetPixel (-y+x0,-x+y0,color);      
        pDC->SetPixel (y+x0,-x+y0,color);
        if(d<0)   
            d=d+2*x+3;
        else
            d=d+2*(x-y)+5, y--;
        x++;     
    

  3.线宽处理

void Circle_W (CDC *pDC,int x0,int y0,int r,COLORREF color, int w)
 
    int x,y; float d=1/(2*r*3.14);
	for(float t=0;t<6.3;t=t+d)	
        x=x0+r*cos(t);
		y=y0+r*sin(t);
		float dt=1.0/(3.14*w);
		for(float t=0;t<6.3;t=t+dt)
            xx=x+w/2*cos(t);
            yy=y+w/2*cos(t);
            pDC->SetPixel(xx,yy,color);
        
    

以上是关于计算机图形学-二维图形生成算法的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学-二维图形生成算法

计算机图形学实验一——基本图素的生成算法和图形填充

计算机图形学输出图元_6_OpenGL曲线函数_4_中点椭圆算法(下)

计算机图形学08:中点BH算法绘制抛物线(100x = y^2)

计算机图形学输出图元_7_并行曲线算法

计算机图形学实验二——二维图形几何变换及裁剪