计算机图形学实验一Word文档下载推荐.docx
《计算机图形学实验一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验一Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
//VC画线、VC画圆、VC画椭圆命令处理函数
OnDrawVcline()
CurrentDraw=DRAW_VCLINE;
DrawType=0;
OnDrawVccircle()
CurrentDraw=DRAW_VCCIRCLE;
DrawType=0;
OnDrawVcellipse()
CurrentDraw=DRAW_VCELLIPSE;
//shape.h
//以下为第二章所用的类定义
classCLine:
publicCShape
protected:
intm_drawtype;
//
POINTm_pStart,m_pEnd;
CLine(){}
DECLARE_SERIAL(CLine)
public:
CLine(POINTpStart,POINTpEnd,intWidth,intStyle,COLORREFColor,intm_drawtype);
//intm_drawtype
voidDrawing(CDC*pDC);
voidVCLine(CDC*pDC);
voidSerialize(CArchive&
ar);
};
classCCircle:
POINTm_pFP,m_pSP;
COLORREFm_FColor;
intm_FFlag,m_HFlag,m_HPattern;
CCircle(){}
DECLARE_SERIAL(CCircle)
CCircle(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,
intm_FFlag,COLORREFFColor,intHFlag,intHPattern,intm_drawtype);
voidVCCircle(CDC*pDC);
classCEllipse:
CEllipse(){}
DECLARE_SERIAL(CEllipse)
CEllipse(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,
voidVCEllipse(CDC*pDC);
//实现文件shape.cpp
//CShape
IMPLEMENT_SERIAL(CShape,CObject,1)
voidCShape:
Serialize(CArchive&
ar)
if(ar.IsStoring())
ar<
<
m_pColor<
m_pWidth<
m_pStyle;
else
ar>
>
m_pColor>
m_pWidth>
//CLine
IMPLEMENT_SERIAL(CLine,CShape,1)
CLine:
CLine(POINTpStart,POINTpEnd,intWidth,intStyle,COLORREFColor,intdrawtype)
m_pStart=pStart;
m_pEnd=pEnd;
m_pWidth=Width;
m_pStyle=Style;
m_pColor=Color;
m_drawtype=drawtype;
voidCLine:
Drawing(CDC*pDC)
switch(m_drawtype)//
{
case0:
VCLine(pDC);
break;
case1:
DDALine(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,m_pColor,m_pWidth,pDC);
case2:
MidpointLine(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,m_pColor,m_pWidth,pDC);
case3:
BresenhamLine(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,m_pColor,m_pWidth,pDC)
}
//下面是VC的画线函数
VCLine(CDC*pDC)
CPenNewPen,*pOldPen;
NewPen.CreatePen(m_pStyle,m_pWidth,m_pColor);
pOldPen=pDC->
SelectObject(&
NewPen);
pDC->
MoveTo(m_pStart);
LineTo(m_pEnd);
SelectObject(pOldPen);
m_pStart.x<
m_pStart.y
<
m_pEnd.x<
m_pEnd.y<
m_drawtype;
m_pStart.x>
>
m_pEnd.x>
m_pEnd.y>
CShape:
Serialize(ar);
//CCircle
IMPLEMENT_SERIAL(CCircle,CShape,1)
CCircle:
CCircle(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,
intFFlag,COLORREFFColor,intHFlag,intHPattern,intdrawtype)
m_pFP=pFP;
m_pSP=pSP;
m_FFlag=FFlag;
m_FColor=FColor;
m_HFlag=HFlag;
m_HPattern=HPattern;
voidCCircle:
intxc,yc,r;
switch(m_drawtype)
VCCircle(pDC);
xc=m_pFP.x;
yc=m_pFP.y;
r=sqrt((m_pFP.x-m_pSP.x)*(m_pFP.x-m_pSP.x)+(m_pFP.y-m_pSP.y)*(m_pFP.y-m_pSP.y));
MidCircle(xc,yc,r,m_pColor,m_pWidth,pDC);
BresenhamCircle(xc,yc,r,m_pColor,m_pWidth,pDC);
//下面是VC画圆函数
VCCircle(CDC*pDC)
SelectStockObject(NULL_BRUSH);
CBrushNewBrush,*pOldBrush;
if(m_FFlag)
if(m_HFlag==0)
NewBrush.CreateSolidBrush(m_FColor);
NewBrush.CreateHatchBrush(m_HPattern,m_FColor);
pOldBrush=pDC->
NewBrush);
Ellipse(m_pFP.x,m_pFP.y,m_pSP.x,m_pSP.y);
if(m_FFlag)pDC->
SelectObject(pOldBrush);
m_pFP.x<
m_pFP.y<
m_pSP.x<
m_pSP.y
m_FFlag<
m_FColor<
m_HFlag<
m_HPattern<
m_pFP.x>
m_pFP.y>
m_pSP.x>
m_FFlag>
m_FColor>
m_HFlag>
m_HPattern>
//CEllipse
IMPLEMENT_SERIAL(CEllipse,CShape,1)
CEllipse:
CEllipse(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,
voidCEllipse:
intxc,yc,a,b;
VCEllipse(pDC);
break;
xc=(m_pFP.x+m_pSP.x)/2;
yc=(m_pFP.y+m_pSP.y)/2;
a=abs(m_pFP.x-m_pSP.x)/2;
b=abs(m_pFP.y-m_pSP.y)/2;
MidEllipse(xc,yc,a,b,m_pColor,m_pWidth,pDC);
break;
//下面是VC的画椭圆函数
VCEllipse(CDC*pDC)
//BasicGraph.cpp
//下面是Bresenham的画线函数,请参照上面DDA和中点画线法,把它补充完整。
voidBresenhamLine(intx1,inty1,intx2,inty2,COLORREFcolor,intwidth,CDC*pDC)
intx,y,dx,dy,dk,i,s1,s2,temp,swap;
//请在此处补充代码
dx=abs(x2-x1);
dy=abs(y2-y1);
x=x1;
y=y1;
s1=Sign(x2-x1);
s2=Sign(y2-y1);
if(dy>
dx){temp=dx;
dx=dy;
dy=temp;
swap=1;
elseswap=0;
dk=2*dy-dx;
for(i=1;
i<
=dx;
i++)
LineWidthProcess(x,y,abs(x2-x1),abs(y2-y1),color,width,pDC);
if(swap==1)y=y+s2;
elsex=x+s1;
dk=dk+2*dy;
if(dk>
=0)
{
if(swap==1)x=x+s1;
elsey=y+s2;
dk-=2*dx;
}
intSign(intx)
if(x<
0)return-1;
elseif(x==0)return0;
elsereturn1;
//下面是Bresenham画圆函数,请参照上面中点画圆函数,把它补充完整。
voidBresenhamCircle(intxc,intyc,intr,COLORREFcolor,intwidth,CDC*pDC)
intx,y,d;
x=0;
y=r;
//请在此处补充代码
d=3-2*r;
while(x<
y)
WholeCircle(xc,yc,x,y,color,width,pDC);
if(d<
0)
d=d+4*x+6;
d=d+4*(x-y)+10;
y--;
x++;
if(x==y)WholeCircle(xc,yc,x,y,color,width,pDC);
//下面是中点画椭圆函数,请把它补充完整
voidMidEllipse(intxc,intyc,inta,intb,COLORREFcolor,intwidth,CDC*pDC)
intaa=a*a,bb=b*b;
inttwoaa=2*aa,twobb=2*bb;
intx=0,y=b;
intdx=0,dy=twoaa*y;
intd=(int)(bb+aa*(-b+0.25)+0.5);
WholeEllipse(xc,yc,x,y,color,width,pDC);
////请在此处补充代码
while(dx<
dy)
{x++;
dx+=twobb;
if(d<
0)d+=bb+dx;
else{y--;
dy-=twoaa;
d+=bb+dx-dy;
WholeEllipse(xc,yc,x,y,color,width,pDC);
d=(int)(bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb+0.5);
while(y>
0)
{y--;
if(d>
0)d+=aa-dy;
else{x++;
dx+=twobb;
d+=aa-dy+dx;
三、实验结果
四、实验总结
在本次实验中,我通过对课堂上所学知识的应用,学到了很多实践中的知识。
并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解多种算法实现基本图形