计算机图形学实验一Word文档下载推荐.docx

上传人:b****6 文档编号:17305964 上传时间:2022-12-01 格式:DOCX 页数:13 大小:44.40KB
下载 相关 举报
计算机图形学实验一Word文档下载推荐.docx_第1页
第1页 / 共13页
计算机图形学实验一Word文档下载推荐.docx_第2页
第2页 / 共13页
计算机图形学实验一Word文档下载推荐.docx_第3页
第3页 / 共13页
计算机图形学实验一Word文档下载推荐.docx_第4页
第4页 / 共13页
计算机图形学实验一Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

计算机图形学实验一Word文档下载推荐.docx

《计算机图形学实验一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验一Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

计算机图形学实验一Word文档下载推荐.docx

//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;

三、实验结果

四、实验总结

在本次实验中,我通过对课堂上所学知识的应用,学到了很多实践中的知识。

并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解多种算法实现基本图形

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1