计算机图形学实习全部代码h文件.docx

上传人:b****7 文档编号:8845177 上传时间:2023-02-02 格式:DOCX 页数:20 大小:19.78KB
下载 相关 举报
计算机图形学实习全部代码h文件.docx_第1页
第1页 / 共20页
计算机图形学实习全部代码h文件.docx_第2页
第2页 / 共20页
计算机图形学实习全部代码h文件.docx_第3页
第3页 / 共20页
计算机图形学实习全部代码h文件.docx_第4页
第4页 / 共20页
计算机图形学实习全部代码h文件.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

计算机图形学实习全部代码h文件.docx

《计算机图形学实习全部代码h文件.docx》由会员分享,可在线阅读,更多相关《计算机图形学实习全部代码h文件.docx(20页珍藏版)》请在冰豆网上搜索。

计算机图形学实习全部代码h文件.docx

计算机图形学实习全部代码h文件

//#include"geometric.h"

#include"stdafx.h"

#include"Graphics.h"

#include

#include"SeqStack.h"

#include

Geo:

:

Geo(CDC*pDC)

{

m_pDC=pDC;

}

Geo:

:

~Geo()

{

}

voidGeo:

:

DDA(intx1,inty1,intx2,inty2,CDC*pDC)

{

CPointpoint;

intm;

inti;

doublesum;

intyk=0,xk=0;

m=(y2-y1)/(x2-x1);

if(m<=1)

{

yk=y1;

for(i=x1;i<=x2;i++)

{

point.x=i;

point.y=yk;

pDC->SetPixel(i,yk,RGB(255,0,0));

yk=yk+m;

}

}

elseif(m>1)

{

sum=0;

for(i=y1;i<=y2;i++)

{

sum=sum+(1/m);

if((1/m)<1)

sum=sum+1;

xk=x1+int(sum);

pDC->SetPixel(xk,i,RGB(255,0,0));//该函数将指定坐标处的像素设为指定的颜色

}

}

}

intsign(doublex)

{

if(x<0)return-1;

elsereturn1;

}

voidGeo:

:

Bresenham(intx1,inty1,intx2,inty2,CDC*pDC)

{intx,y,dx,dy,s1,s2,temp,interchange,i,p;

x=x1;y=y1;

dx=abs(x2-x1);

dy=abs(y2-y1);

s1=sign(x2-x1);

s2=sign(y2-y1);

if(dy>dx)

{temp=dx;dx=dy;dy=temp;

interchange=1;

}

elseinterchange=0;

p=2*dy-dx;

for(i=1;i<=dx;i++)

{pDC->SetPixel(x,y,RGB(255,0,0));

if(p>=0)

{if(interchange==1)

x=x+s1;

elsey=y+s2;

p=p-2*dx;

}

if(interchange==1)

y=y+s2;

elsex=x+s1;

p=p+2*dy;

}

}

voidGeo:

:

mpline(intx1,inty1,intx2,inty2,CDC*pDC)

{

intx=0,y,a,b,d1,d2,p;

a=y1-y2;b=x2-x1;

y=y1;

p=2*a+b;

d1=2*a;

d2=2*(a+b);

pDC->SetPixel(x,y,RGB(255,0,0));

for(x=x1;x<=x2;x++)

{

if(p<0)

{

y++;

p+=d2;

}

elsep+=d1;

pDC->SetPixel(x,y,RGB(255,0,0));

}

}

///////////////////画圆函数的定义//////////////////

//////////////中点画圆算法/////////////////////////

voidGeo:

:

circleMidpoint(intx0,inty0,intradius,CDC*pDC)///////(x0,y0)是圆心坐标,radius半径

{

intp=1-radius;//初始决策参数

intx=0,y=0;

intx1=0;

inty1=radius;

circlePlotPonits(x0,y0,x,y1,pDC);//八分打圆形函数

while(x

{

x++;

if(p<0)

p+=2*x+1;

else

{

y1--;

p+=2*(x-y1)+1;

}

circlePlotPonits(x0,y0,x,y1,pDC);

}

}

//八分打圆形函数

voidGeo:

:

circlePlotPonits(intx0,inty0,intx,inty,CDC*pDC)

{

pDC->SetPixel(x0+x,y0+y,RGB(255,0,0));

pDC->SetPixel(x0-x,y0+y,RGB(255,0,0));

pDC->SetPixel(x0+x,y0-y,RGB(255,0,0));

pDC->SetPixel(x0-x,y0-y,RGB(255,0,0));

pDC->SetPixel(x0+y,y0+x,RGB(255,0,0));

pDC->SetPixel(x0-y,y0+x,RGB(255,0,0));

pDC->SetPixel(x0+y,y0-x,RGB(255,0,0));

pDC->SetPixel(x0-y,y0-x,RGB(255,0,0));

}

//////////////////////////////dda画圆函数的定义//////////////////

voidGeo:

:

ddacircle(intx0,inty0,intradius,CDC*pDC)

{

doublel=0.3;//角度增量对应的弧长。

doublet0=l/radius;//t0为角度的增量,弧度制表示。

doublet=0;

doublePI=3.141592654;

doublex=radius,y=0;

pDC->SetPixel((int)(x0+x),(int)(y0+y),RGB(255,255,255));

while(t<=2*PI)

{

x=(1-t0*t0/2)*x-t0*y;

y=(1-t0*t0/2)*y+t0*x;

t+=t0;

pDC->SetPixel(int(x0+x),int(y0+y),RGB(255,255,0));

}

}

//////////////////////////////Bresenham画圆函数的定义//////////////////

voidGeo:

:

Bresenham_Circle(intr,CDC*pDC)

{

intp=3-2*r,x=0,y=r;

while(x!

=r)

{

if(p>=0)

{

p=p+4*(x-y)+10;

x++;

y--;

}

else

{

p=p+4*x+6;

x++;

}

pDC->SetPixel(x,y,RGB(0,0,255));

pDC->SetPixel(x,-y,RGB(0,0,255));

pDC->SetPixel(-x,y,RGB(0,0,255));

pDC->SetPixel(-x,-y,RGB(0,0,255));

pDC->SetPixel(y,x,RGB(0,0,255));

pDC->SetPixel(y,-x,RGB(0,0,255));

pDC->SetPixel(-y,x,RGB(0,0,255));

pDC->SetPixel(-y,-x,RGB(0,0,255));

}

}

//////////////////////////////EllispeMidpoint画椭圆函数的定义//////////////////

inlineintround(constfloata){returnint(a+0.5);}

voidGeo:

:

ellipseMidpoint(intxCernter,intyCenter,intRx,intRy,CDC*pDC)

{

intRx2=Rx*Rx;

intRy2=Ry*Ry;

inttwoRx2=2*Rx2;

inttwoRy2=2*Ry2;

intp;

intx=0;

inty=Ry;

intpx=0;

intpy=twoRx2*y;

p=round(Ry2-(Rx2*Ry)+(0.25*Rx2));

while(px

{

x++;

px+=twoRy2;

if(p<0)

p+=Ry+px;

else

{

y--;

py-=twoRx2;

p+=Ry2+px-py;

}

ellispsePlotPoints(xCernter,yCenter,x,y,pDC);

}

while(y>0)/////斜率绝对值小于一的部分

{

y--;

py-=twoRx2;

if(p>0)

p+=Rx2-py;

else

{

x++;

px+=twoRy2;

p+=Rx2-Ry+px;

}

ellispsePlotPoints(xCernter,yCenter,x,y,pDC);

}

}

//四分打椭圆形函数

voidGeo:

:

ellispsePlotPoints(intxCernter,intyCenter,intx,inty,CDC*pDC)

{

pDC->SetPixel(xCernter+x,yCenter+y,RGB(0,255,0));

pDC->SetPixel(xCernter-x,yCenter+y,RGB(0,255,0));

pDC->SetPixel(xCernter+x,yCenter-y,RGB(0,255,0));

pDC->SetPixel(xCernter-x,yCenter-y,RGB(0,255,0));

}

//////////////////////拉格朗日画曲线算法///////////////////////////////

voidGeo:

:

Lugrange(intxa[],intya[],intza[],intk,intl_section,CDC*pDC)

{

doubleblend[100][100],f_blend[100][100],l_blend[100][100];

intxsm[100],ysm[100],zsm[100];

for(inti=0;i

{

intu=i/l_section;/*求中间段混合函数值*/

blend[0][i]=u*(u-1)*(u-2)/(-6);

blend[1][i]=(u+1)*(u-1)*(u-2)/2;

blend[2][i]=(u+1)*u*(u-2)/(-2);

blend[3][i]=(u+1)*u*(u-1)/6;

intv=u-1;/*求第一段混合函数值*/

f_blend[0][i]=v*(v-1)*(v-2)/(-6);

f_blend[1][i]=(v+1)*(v-1)*(v-2)/2;

f_blend[2][i]=(v+1)*v*(v-2)/(-2);

f_blend[3][i]=(v+1)*v*(v-1)/6;

intw=u+1;/*求最后一段混合函数值*/

l_blend[0][i]=w*(w-1)*(w-2)/6;

l_blend[1][i]=(w+1)*(w-1)*(w-2)/2;

l_blend[2][i]=(w+1)*w*(w-2)/(-2);

l_blend[3][i]=(w+1)*w*(w-1)/6;

}

for(inti=0;i<4;i++)/*取0~3控制点坐标*/

{

xsm[i]=xa[i];

ysm[i]=ya[i];

zsm[i]=za[i];

}

pDC->MoveTo(xa[0],ya[0]);

//pDC->SetPixel(xa[0],ya[0],RGB(0,255,0));

for(intj=0;j

{

doublex=0,y=0,z=0;

for(inti=0;i<4;i++)/*求第j直线段的插值点坐标*/

{

x=x+xsm[i]*f_blend[i][j];

y=y+ysm[i]*f_blend[i][j];

z=z+zsm[i]*f_blend[i][j];

}

pDC->LineTo(x,y);/*画第j个直线段*/

}

for(intm=4;m

{

for(intj=0;j<=l_section;j++)

{

doublex=0,y=0,z=0;

for(inti=0;i<4;i++)

{

x=x+xsm[i]*blend[i][j];

y=y+ysm[i]*blend[i][j];

z=z+zsm[i]*blend[i][j];

}

pDC->LineTo(x,y);

}

for(inti=0;i<3;i++)/*推进下一个样本点*/

{

xsm[i]=xsm[i+1];

ysm[i]=ysm[i+1];

zsm[i]=zsm[i+1];

}

xsm[3]=xa[m];

ysm[3]=ya[m];

zsm[3]=za[m];

}

for(intj=0;j

{

doublex=0,y=0,z=0;

for(inti=0;i<4;i++)

{

x=x+xsm[i]*l_blend[i][j];

y=y+ysm[i]*l_blend[i][j];

z=z+zsm[i]*l_blend[i][j];

}

pDC->LineTo((int)x,(int)y);

}

pDC->LineTo(xsm[3],ysm[3]);

}

//////////////////////扫描线种子填充算法///////////////////////////////

voidGeo:

:

ScanLineSeedFill(intx0,inty0,CDC*pDC)

{

SeqStackstk;

POINTpoint;

point.x=x0;

point.y=y0;

stk.Push(point);

/*pDC->MoveTo(100,100);

pDC->LineTo(300,300);

pDC->MoveTo(300,300);

pDC->LineTo(200,300);

pDC->MoveTo(200,300);

pDC->LineTo(100,100);*/

POINTp[9];

p[0].x=100;p[0].y=400-200;

p[1].x=300;p[1].y=400-200;

p[2].x=300;p[2].y=400-200;

p[3].x=500;p[3].y=400-200;

p[4].x=700;p[4].y=400-200;

p[5].x=900;p[5].y=400-200;

p[6].x=900;p[6].y=700-200;

p[7].x=100;p[7].y=700-200;

p[8].x=100;p[8].y=400-200;

CPenmyPen;

myPen.CreatePen(0,1,RGB(0,255,0));

CPen*pOldPen=pDC->SelectObject(&myPen);//记录原画笔

pDC->MoveTo(p[0]);

for(inti=0;i<9;i++)

pDC->LineTo(p[i]);

pDC->SelectObject(pOldPen);

COLORREFc=RGB(255,0,0);

COLORREFb=RGB(0,255,0);

while(!

stk.IsEmpty())

{

POINTpo;

stk.Pop(po);

intxLeft=0,xRight=0;

pDC->SetPixel(po,c);

intsavex=po.x;

po.x=po.x+1;

COLORREFa=pDC->GetPixel(po);

while(pDC->GetPixel(po)!

=c&&pDC->GetPixel(po)!

=b)//填充右边的区域

{

pDC->SetPixel(po,c);

po.x=po.x+1;

}

xRight=po.x-1;

po.x=savex-1;

while(pDC->GetPixel(po)!

=c&&pDC->GetPixel(po)!

=b)//填充左边的区域

{

pDC->SetPixel(po,c);

po.x--;

}

po.x++;

xLeft=po.x;

po.y=po.y-1;

intsearch=1;

while(po.x<=xRight)/*searchseedfromleft*/

{

if(search==1)

{

if(pDC->GetPixel(po)!

=c&&pDC->GetPixel(po)!

=b)

{

stk.Push(po);/*havesearched*/

search=0;

}

}

else

if(pDC->GetPixel(po)!

=c||pDC->GetPixel(po)!

=b)

search=1;/*ignoreotherpoints*/

po.x++;

}

po.x=xLeft;

po.y=po.y+2;

search=1;

while(po.x<=xRight)

{/*searchseedinthehigherrow*/

if(search==1)

{

if(pDC->GetPixel(po)!

=c&&pDC->GetPixel(po)!

=b)

{

stk.Push(po);

search=0;

}

}

else

if(pDC->GetPixel(po)!

=c||pDC->GetPixel(po)!

=b)

search=1;

po.x++;

}

}

}

voidGeo:

:

SeedFiled(CDC*pDC)

{

pDC->MoveTo(100,100);

pDC->LineTo(300,300);

pDC->MoveTo(300,300);

pDC->LineTo(200,300);

pDC->MoveTo(200,300);

pDC->LineTo(100,100);

SeqStacksta;

POINTs[100000];

inti=0;

s[i].x=150;

s[i].y=160;

intm,n;

sta.Push(s[i]);//起始点入栈

while(!

sta.IsEmpty())

{

sta.Pop(s[i]);

m=s[i].x;

n=s[i].y;

if(pDC->GetPixel(m,n)!

=RGB(0,0,0))

{

pDC->SetPixel(m,n,RGB(0,0,0));

i++;

}

if(pDC->GetPixel(m+1,n)!

=RGB(0,0,0))

{

s[i].x=m+1;

s[i].y=n;

sta.Push(s[i]);

i++;

}

if(pDC->GetPixel(m-1,n)!

=RGB(0,0,0))

{

s[i].x=m-1;

s[i].y=n;

sta.Push(s[i]);

i++;

}

if(pDC->GetPixel(m,n+1)!

=RGB(0,0,0))

{

s[i].x=m;

s[i].y=n+1;

sta.Push(s[i]);

i++;

}

if(pDC->GetPixel(m,n-1)!

=RGB(0,0,0))

{

s[i].x=m;

s[i].y=n-1;

sta.Push(s[i]);

}

}

}

//用Bresenham画线

shortGeo:

:

Algorithm1(floatx1,floaty1,floatx2,floaty2,unsignedlongcolor,CDC*pDC)//算法1,Bresenham划线

{

floatdx=x2-x1,dy=y2-y1,steps,k;

floatxincrement,yincrement,x=x1,y=y1;

if(fabs(dx)>fabs(dy))

steps=fabs(dx);

else

steps=fabs(dy);

xincrement=float(dx)/float(steps);

yincrement=float(dy)/float(steps);

pDC->SetPixel(round(x),round(y),RGB(255,0,0));

for(k=0;k

x+=xincrement;

y+=yincrement;

pDC->SetPixel(round(x),round(y),RGB(255,0,0));

}

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

当前位置:首页 > 考试认证 > 公务员考试

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

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