计算机图形学实验一Word文档下载推荐.docx
《计算机图形学实验一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验一Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
CurrentDraw=DRAW_MIDELLIPSE。
//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_drawtypeb5E2RGbCAP
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,p1EanqFDPw
intm_FFlag,COLORREFFColor,intHFlag,intHPattern,intm_drawtype>
//DXDiTa9E3d
voidVCCircle(CDC*pDC>
classCEllipse:
intm_drawtype。
CEllipse(>
DECLARE_SERIAL(CEllipse>
CEllipse(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,RTCrpUDGiT
5PCzVD7HxA
voidVCEllipse(CDC*pDC>
//实现文件shape.cpp
//CShape
IMPLEMENT_SERIAL(CShape,CObject,1>
voidCShape:
Serialize(CArchive&
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>
jLBHrnAILg
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>
xHAQX74J0X
case2:
MidpointLine(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,m_pColor,m_pWidth,pDC>
LDAYtRyKfE
case3:
BresenhamLine(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,m_pColor,m_pWidth,pDC>
Zzz6ZB2Ltk
}
//下面是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。
else
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,dvzfvkwMI1
intFFlag,COLORREFFColor,intHFlag,intHPattern,intdrawtype>
rqyn14ZNXI
m_pFP=pFP。
m_pSP=pSP。
m_FFlag=FFlag。
m_FColor=FColor。
m_HFlag=HFlag。
m_HPattern=HPattern。
voidCCircle:
intxc,yc,r。
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>
EmxvxOtOco
MidCircle(xc,yc,r,m_pColor,m_pWidth,pDC>
SixE2yXPq5
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>
SelectObject(pOldBrush>
ar<
m_pFP.x<
m_pFP.y<
m_pSP.x<
m_pSP.y
m_FFlag<
m_FColor<
m_HFlag<
m_HPattern<
6ewMyirQFL
m_pFP.x>
m_pFP.y>
m_pSP.x>
>
m_FFlag>
m_FColor>
m_HFlag>
m_HPattern>
kavU42VRUs
//CEllipse
IMPLEMENT_SERIAL(CEllipse,CShape,1>
CEllipse:
CEllipse(POINTpFP,POINTpSP,intWidth,intStyle,COLORREFColor,y6v3ALoS89
M2ub6vSTnP
m_drawtype=drawtype。
voidCEllipse:
intxc,yc,a,b。
VCEllipse(pDC>
break。
xc=(m_pFP.x+m_pSP.x>
/2。
yc=(m_pFP.y+m_pSP.y>
a=abs(m_pFP.x-m_pSP.x>
b=abs(m_pFP.y-m_pSP.y>
MidEllipse(xc,yc,a,b,m_pColor,m_pWidth,pDC>
break。
//下面是VC的画椭圆函数
VCEllipse(CDC*pDC>
0YujCfmUCw
eUts8ZQVRd
CShape:
//BasicGraph.cpp
//下面是Bresenham的画线函数,请参照上面DDA和中点画线法,把它补充完整。
voidBresenhamLine(intx1,inty1,intx2,inty2,COLORREFcolor,intwidth,CDC*pDC>
sQsAEJkW5T
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>
GMsIasNXkA
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>
TIrRGchYzg
intx,y,d。
x=0。
y=r。
//请在此处补充代码
d=3-2*r。
while(x<
y>
WholeCircle(xc,yc,x,y,color,width,pDC>
if(d<
d=d+4*x+6。
d=d+4*(x-y>
+10。
y--。
x++。
if(x==y>
//下面是中点画椭圆函数,请把它补充完整
voidMidEllipse(intxc,intyc,inta,intb,COLORREFcolor,intwidth,CDC*pDC>
7EqZcWLZNX
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>
lzq7IGf02E
while(y>
0>
{y--。
if(d>
d+=aa-dy。
else{x++。
dx+=twobb。
d+=aa-dy+dx。
三、实验结果
四、实验总结
在本次实验中,我通过对课堂上所学知识的应用,学到了很多实践中的知识。
并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解多种算法实现基本图形zvpgeqJ1hk
申明:
所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。