计算机图形学实习全部代码h文件.docx
《计算机图形学实习全部代码h文件.docx》由会员分享,可在线阅读,更多相关《计算机图形学实习全部代码h文件.docx(20页珍藏版)》请在冰豆网上搜索。
计算机图形学实习全部代码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;kx+=xincrement;
y+=yincrement;
pDC->SetPixel(round(x),round(y),RGB(255,0,0));
}