图形学实验报告Word格式文档下载.docx
- 文档编号:7486585
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:30
- 大小:97.63KB
图形学实验报告Word格式文档下载.docx
《图形学实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《图形学实验报告Word格式文档下载.docx(30页珍藏版)》请在冰点文库上搜索。
y=y1;
dk=dk+2*dy;
if(dk>
=0)
{y++;
dk=dk-2*dx;
voidCLineView:
:
OnDraw(CDC*pDC)
CLineDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
DDALine(100,100,200,70,255,pDC);
//数值微分法
TextOut(200,70,"
数值微分画线"
);
MPLine(100,120,200,140,255,pDC);
//中点画线法
TextOut(200,140,"
中点画线"
BHLine(100,140,200,190,255,pDC);
//Bresenham画线法
TextOut(200,190,"
Bresenham画线法"
//TODO:
adddrawcodefornativedatahere
运行结果:
2、圆的生成程序设计:
掌握用C/WIN-TC/VC++实现算法,圆的生成算法
用中点画圆法、Bresenham画圆法
//CCircleViewdrawing
voidWholeCircle(intxc,intyc,intx,inty,intcolor,CDC*pDC)
SetPixel(xc+x,yc+y,color);
SetPixel(xc-x,yc+y,color);
SetPixel(xc+x,yc-y,color);
SetPixel(xc-x,yc-y,color);
SetPixel(xc+y,yc+x,color);
SetPixel(xc-y,yc+x,color);
SetPixel(xc+y,yc-x,color);
SetPixel(xc-y,yc-x,color);
voidMidCircle(intxc,intyc,intr,intcolor,CDC*pDC)//中点画圆法
intx,y,d;
x=0;
y=r;
d=1-r;
WholeCircle(xc,yc,x,y,color,pDC);
while(x<
=y)
0)
{d+=2*x+3;
x++;
else
{d+=2*(x-y)+5;
y--;
voidBresenhamCircle(intxc,intyc,intr,intcolor,CDC*pDC)//Bresenham画圆法
{intx,y,d;
y=r;
d=3-2*r;
y)
d=d+4*x+6;
d=d+4*(x-y)+10;
x++;
if(x==y)WholeCircle(xc,yc,x,y,color,pDC);
voidCCircleView:
CCircleDoc*pDoc=GetDocument();
MidCircle(100,100,70,255,pDC);
//中点画圆法
TextOut(175,100,"
中点画圆法"
BresenhamCircle(100,250,80,255,pDC);
//Bresenham画圆法
TextOut(185,250,"
Bresenham画圆法"
3、椭圆的生成程序设计:
掌握用C/WIN-TC/VC++实现算法,椭圆的生成算法
实现椭圆的算法
//CMPEllipseViewdrawing
voidWholeEllipse(intxc,intyc,intx,inty,intcolor,CDC*pDC)
voidMidEllipse(intxc,intyc,inta,intb,intcolor,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,pDC);
while(dx<
dy)
dx+=twobb;
d+=bb+dx;
{y--;
dy-=twoaa;
d+=bb+dx-dy;
d=(int)(bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb+0.5);
while(y>
dy-=twoaa;
if(d>
d+=aa-dy;
{x++;
dx+=twobb;
d+=aa-dy+dx;
voidCMPEllipseView:
CMPEllipseDoc*pDoc=GetDocument();
MidEllipse(200,100,100,50,255,pDC);
TextOut(305,100,"
中点画椭圆法"
4.有序边表填充算法程序设计
掌握用C/WIN-TC/VC++实现算法,有序边生成算法
实现有序边填充算法
代码如下:
#defineWINDOW_HEIGHT480
#defineNULL0
typedefstructtEdge/*有序便表和活化边表的结构*/
intymax;
floatx,dx;
structtEdge*next;
}Edge;
typedefstructpoint
intx,y;
}tPOINT;
voidInsertEdge(Edge*list,Edge*edge)
Edge*p,*q=list;
p=q->
next;
while(p)
if(edge->
x<
p->
x)
{
p=NULL;
}
else
q=p;
p=p->
}
edge->
next=q->
q->
next=edge;
intyNext(intk,intcnt,tPOINT*pts)
intj;
if((k+1)>
(cnt-1))
j=0;
}
j=k+1;
while(pts[k].y==pts[j].y)
{if((j+1)>
(cnt-1))
{j=0;
}
{j++;
returnpts[j].y;
voidMakeEdgeRec(tPOINTlower,tPOINTupper,intyComp,Edge*edge,Edge*edges[])/*生成有序边表的一条边*/
dx=(float)(upper.x-lower.x)/(upper.y-lower.y);
x=lower.x;
if(upper.y<
yComp)
edge->
ymax=upper.y-1;
ymax=upper.y;
InsertEdge(edges[lower.y],edge);
voidBuildEdgeList(intcnt,tPOINT*pts,Edge*edges[])
{Edge*edge;
tPOINTv1,v2;
inti,yPrev=pts[cnt-2].y;
v1.x=pts[cnt-1].x;
v1.y=pts[cnt-1].y;
for(i=0;
i<
cnt;
i++)
v2=pts[i];
if(v1.y!
=v2.y)
edge=(Edge*)malloc(sizeof(Edge));
/*C语言中的malloc*/
if(v1.y<
v2.y)
{
MakeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);
else
MakeEdgeRec(v2,v1,yPrev,edge,edges);
}
yPrev=v1.y;
v1=v2;
voidBuildActiveList(intscan,Edge*active,Edge*edges[])
Edge*p,*q;
p=edges[scan]->
while(p)
q=p->
InsertEdge(active,p);
p=q;
voidFillScan(intscan,Edge*active,intcolor,CDC*pDC)
inti;
Edge*p1,*p2;
p1=active->
while(p1)
p2=p1->
for(i=p1->
x;
p2->
pDC->
SetPixel((int)i,scan,color);
p1=p2->
voidDeletAfter(Edge*q)
Edge*p=q->
next=p->
free(p);
voidUpdateActiveList(intscan,Edge*active)
Edge*q=active,*p=active->
if(scan>
=p->
ymax)
DeletAfter(q);
p->
x=p->
x+p->
dx;
voidResortActiveList(Edge*active)
Edge*q,*p=active->
active->
next=NULL;
voidScanFill(intcnt,tPOINT*pts,intcolor,CDC*pDC)
Edge*edges[WINDOW_HEIGHT],*active;
inti,scan,scanmax=0,scanmin=WINDOW_HEIGHT;
cnt-1;
if(scanmax<
pts[i].y)
scanmax=pts[i].y;
if(scanmin>
scanmin=pts[i].y;
for(scan=scanmin;
scan<
=scanmax;
scan++)
edges[scan]=(Edge*)malloc(sizeof(Edge));
edges[scan]->
BuildEdgeList(cnt,pts,edges);
active=(Edge*)malloc(sizeof(Edge));
BuildActiveList(scan,active,edges);
if(active->
next)
FillScan(scan,active,color,pDC);
UpdateActiveList(scan,active);
ResortActiveList(active);
CFillView:
CFillView()
addconstructioncodehere
~CFillView()
BOOLCFillView:
PreCreateWindow(CREATESTRUCT&
cs)
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
PreCreateWindow(cs);
//CFillViewdrawing
voidCFillView:
CFillDoc*pDoc=GetDocument();
tPOINTpoints[3]={{100,80},{300,100},{300,260}};
tPOINT*p=points;
intcolor=RGB(255,2,0);
ScanFill(3,p,color,pDC);
}
8.Cohen-SutherLand编码裁剪算法程序设计
#defineLEFT1
#defineRIGHT2
#defineBOTTOM4
#defineTOP8
typedefstructpoint{intx,y;
}POINT1;
voidEncode(intx,inty,int*code,intXL,intXR,intYB,intYT,CDC*pDC)
intc=0;
if(x<
XL)c=c|LEFT;
elseif(x>
XR)c=c|RIGHT;
if(y<
YB)c=c|BOTTOM;
elseif(y>
YT)c=c|TOP;
(*code)=c;
voidC_S_Line(POINTp1,POINTp2,intXL,intXR,intYB,intYT,CDC*pDC)
intx1,x2,y1,y2,x,y;
intcode1,code2,code;
x1=p1.x;
x2=p2.x;
y1=p1.y;
y2=p2.y;
Encode(x1,y1,&
code1,XL,XR,YB,YT,pDC);
Encode(x2,y2,&
code2,XL,XR,YB,YT,pDC);
while(code1!
=0||code2!
if((code1&
code2)!
=0)return;
code=code1;
if(code1==0)code=code2;
if((LEFT&
code)!
x=XL;
y=y1+(y2-y1)*(XL-x1)/(x2-x1);
elseif((RIGHT&
code)!
x=XR;
y=y1+(y2-y1)*(XR-x1)/(x2-x1);
elseif((BOTTOM&
=0)
y=YB;
x=x1+(x2-x1)*(YB-y1)/(y2-y1);
elseif((TOP&
y=YT;
x=x1+(x2-x1)*(YT-y1)/(y2-y1);
if(code==code1)
x1=x;
y1=y;
Encode(x,y,&
x2=x;
y2=y;
p1.x=x1;
p1.y=y1;
p2.x=x2;
p2.y=y2;
MoveTo(p1.x,p1.y);
LineTo(p2.x,p2.y);
voidCCohenView:
CCohenDoc*pDoc=GetDocument();
POINTp1,p2,p3,p4,p5,p6,p7,p8;
p1.x=35;
p1.y=160;
p2.x=245;
p2.y=121;
p3.x=120;
p3.y=60;
p4.x=200;
p4.y=300;
p5.x=169;
p5.y=45;
p6.x=150;
p6.y=200;
p7.x=120;
p7.y=200;
p8.x=220;
p8.y=130;
LineTo(120,100);
LineTo(210,100);
LineTo(220,180);
LineTo(120,170);
LineTo(110,100);
C_S_Line(p1,p2,100,200,90,170,pDC);
C_S_Line(p3,p4,100,200,90,170,pDC);
6.基于链队列的种子填充算法程序设计
程序代码:
typedefstructpoint{intx,y;
}POINT1;
typedefstructQNode
POINTData;
structQNode*Next;
}QNode,*QPtr;
typedefstruct
QPtrFront;
QPtrRear;
}LinkQueue;
LinkQueueq;
voidCreateQueue()
q.Front=q.Rear=(QPtr)malloc(sizeof(QNode));
q.Rear->
Next=NULL;
POINTDequeue()
QNode*p;
POINTx;
p=q.Front;
x=q.Front->
Data;
q.Front=q.Front->
Next;
free(p);
returnx;
voidEnqueue(POINTx)
QNode*p=(QPtr)mall
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 实验 报告