计算机图形学作业

版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/xianpingping/article/details/85010872

1 图形名 五星红旗

 

    1. 算法或者图形介绍

1.1.1先画背景色红色。长宽比:3:2

1.1.2利用了绘画五角星的算法,通过固定长轴和中心点,利用五个点和中心点的角度关系从而计算出五个顶点的坐标,五个顶点均匀分布在圆周上,可以用如下公式计算:

Xi=R∗cos(2∗π∗i5),Xi=R∗sin(2∗π∗i5),i=0,1,2,3,4

1.2 图形代码

1.2.1 五角星代码:

void CallView::Pentagram(int R, int x, int y)
{
	///R:五角形的长轴
	///int x,y五角星的中心点
	///int yDegree:长轴与y轴的夹角
	int yDegree=0;
	double pi=4.0*atan(1.0);
	double rad = pi / 180;               //每度的弧度值
   double r = R * sin(18 * rad) / cos(36 * rad);  //五角星短轴的长度
    POINT RVertex[5], rVertex[5];
    for (int k = 0; k < 5; k++)               //求取坐标
    {
		int lala1=x - (R * cos((90 + k * 72 + yDegree) *rad));
		int lala2=y - (R * sin((90 + k * 72 + yDegree) * rad));
		RVertex[k].x= lala1;
		RVertex[k].y=lala2 ;
		int haha1=x - (r * cos((90 + 36 + k * 72 + yDegree) *rad));
		int haha2=y - (r * sin((90 + 36 + k * 72 + yDegree) * rad));
		
		rVertex[k].x = haha1;
		rVertex[k].y = haha2;
    }
 
    CBrush pNewBrush(RGB(255, 255, 0));
    CBrush pNewBrush1(RGB(255, 255, 0));
 
    for (int i = 0; i < 5; i++)
    {
       POINT polylinepoint[4] = {RVertex[i], rVertex[i], { x, y },RVertex[i] };
       POINT polylinepoint1[4] = {RVertex[(i+1) % 5], rVertex[i], {x, y }, RVertex[(i + 1) % 5] };
	   CClientDC dc(this);
	   CPen pen(PS_SOLID, 1, RGB(255,255,0));
//1是笔的宽度, RGB是宏, 用于生成颜色
	   dc.SelectObject(pen);
      dc.SelectObject(pNewBrush1);
      dc.Polygon(polylinepoint, 4);
	   dc.SelectObject(pNewBrush);
      dc.Polygon(polylinepoint1, 4);
    }
}

1.2.2 背景色代码:

void CallView::Di(void)
{
	RECT Rect1;
	Rect1.bottom=300;
	Rect1.left=0;
	Rect1.top=0;
	Rect1.right=450;
	CBrush Brush(RGB(255,0,0));
	CClientDC dc(this);
	dc.FillRect(&Rect1,&Brush);
}

1.2.3 主代码:

void CallView::OnWuxinghongqi()
{
	Di();
	Pentagram(50, 50, 50);
	Pentagram(18, 130, 20);
	Pentagram(18, 140, 50);
	Pentagram(18, 125, 80);
	Pentagram(18, 100, 110);
}

2图形名 星条旗

2.1算法或者图形介绍

利用MFC中的画刷,先画出7条间距相同的红色长条,然后画黑色框框进行勾勒。然后左上角画一个蓝色矩形,在蓝色矩形里利用上述五角星的算法,通过循环算法画出50颗星星。每一排星星大小有区别。美国国旗长宽比是5:3。

2.2图形代码
2.2.1主函数:
void CallView::OnMeiguoguoqi()
{
	Tiao2();
	jvxing();
	Kuang();
	Xpp();
	// TODO: 在此添加命令处理程序代码
}
2.2.2五角星函数:

int CallView::Wujiaoxing(int R, int x, int y)
{
	///R:五角形的长轴
	///int x,y五角星的中心点
	///int yDegree:长轴与y轴的夹角
	int yDegree=0;
	double pi=4.0*atan(1.0);
	double rad = pi / 180;                  //每度的弧度值
   double r = R * sin(18 * rad) / cos(36 * rad); //五角星短轴的长度
    POINT RVertex[5], rVertex[5];
    for (int k = 0; k < 5; k++)                   //求取坐标
    {
		int lala1=x - (R * cos((90 + k * 72 + yDegree) *rad));
		int lala2=y - (R * sin((90 + k * 72 + yDegree) * rad));
		RVertex[k].x= lala1;
		RVertex[k].y=lala2 ;
		int haha1=x - (r * cos((90 + 36 + k * 72 + yDegree) *rad));
		int haha2=y - (r * sin((90 + 36 + k * 72 + yDegree) * rad));
		
		rVertex[k].x = haha1;
		rVertex[k].y = haha2;
    }
 
    CBrush pNewBrush(RGB(255, 255, 255));
    CBrush pNewBrush1(RGB(255, 255, 255));
 
    for (int i = 0; i < 5; i++)
    {
       POINT polylinepoint[4] = {RVertex[i], rVertex[i], { x, y },RVertex[i] };
       POINT polylinepoint1[4] = {RVertex[(i+1) % 5], rVertex[i], {x, y }, RVertex[(i + 1) % 5] };
	     CPen pen(PS_SOLID, 1, RGB(255,255,255));//1是笔的宽度, RGB是宏, 用于生成颜色
	  
	   CClientDC dc(this);
	  dc.SelectObject(pen);

      //// dc.SelectObject(pNewBrush1);
      dc.Polygon(polylinepoint, 4);
      dc.SelectObject(pNewBrush);
      dc.Polygon(polylinepoint1, 4);
    }
	return 0;
}

2.2.3:黑框勾勒:
void CallView::Kuang(void)
{
	CClientDC dc(this);
	dc.MoveTo(494,0);
	dc.LineTo(494,260);
	dc.MoveTo(0,260);
	dc.LineTo(494,260);
}

2.2.4红色条纹:
void CallView::Tiao2(void)
{
	RECT Rect1;
	int top1=0;
	for(int i=1;i<=7;i++){
	Rect1.left =0;
	Rect1.top = top1;
	Rect1.right =247*2;
	Rect1.bottom = top1+20;

//定义一个画刷
	CBrush Brush(RGB(255,0,0));

//用画刷填充矩形
	CClientDC dc(this);
	dc.FillRect (&Rect1,&Brush); 
	top1+=40;
	}
}

2.2.5:蓝色星区:
void CallView::jvxing(void)
{
	RECT Rect1;
	Rect1.left =0;
	Rect1.top = 0;
	Rect1.right =200;
	Rect1.bottom = 140;

//定义一个画刷
	CBrush Brush(RGB(0,0,255));

//用画刷填充矩形
	CClientDC dc(this);
	dc.FillRect (&Rect1,&Brush); 
}
2.2.6:蓝色星区里星星的排布:
void CallView::Xpp(void)
{
	int xx=0;
	int yy=0;
	for(int i=1;i<=5;i++){
		xx=0;
		for(int j=1;j<=6;j++){
			Wujiaoxing(5,xx+16,yy+14);
			xx+=33;
		}
		yy+=28;
	}
	xx=33;
	yy=28;
	for(int i=1;i<=4;i++){
		xx=33;
		for(int j=1;j<=5;j++){
			Wujiaoxing(4,xx,yy);
			xx+=33;
		}
		yy+=28;
	}
}

3 图形名:分形树

3.1 算法或者图形介绍

利用分支结构递归算法,每一次都调用自身。

3.2 图形代码
3.2.1主函数:
void CallView::OnFenxingshu()
{
	///Invalidate();
	double PI=3.1415926;
	drawTree(300,400,PI/2,75,12);
	drawTree(550,350,PI/3,70,12);
	// TODO: 在此添加命令处理程序代码
	///Invalidate();;

}
3.2.2 画分形树函数:
void CallView::drawTree(int px, int py, double ang, double l, int width)
{
	double PI=3.1415926;
	double arg=15*PI/180;
	double rn=rand()%10*(PI/180);
	int rm=rand()%9;
	if(rm>5)
		rn=0;
	if(width<1)
		width=1;
	int x=px+(int)(l*cos(ang));
	int y=py-(int)(l*sin(ang));
	CClientDC dc(this);
	MoveToEx(dc,px,py,NULL);
	LineTo(dc,x,y);
	if(l<20)
		return;
	drawTree(x,y,ang-arg+rn,0.82*l,width+2);
	drawTree(x,y,ang+arg+rn,0.82*l,width-2);
}

 

4 图形名:小雪花

4.2 图形代码
4.2.1主函数:
void CallView::OnSmallXuehua()
{
	
	Koch(275.0,60.0,50.0,450.0,1.0);
	Koch(500.0,450.0,275.0,60.0,1.0);
	Koch(50.0,450.0,500.0,450.0,1.0);
	Fengche(80,275,320);
	// TODO: 在此添加命令处理程序代码
}

4.2.2 Koch函数:
void CallView::Koch(double ax, double ay, double bx, double by, double c)
{
	double pi=4.0*atan(1.0);
	
	double cx,cy,ex,ey;
	if( ( ( bx - ax ) * ( bx - ax ) + ( by - ay ) * ( by - ay ) ) <c)
	{
		Line(ax,ay,bx,by);
		return ;
	}
	cx=ax+(bx-ax)/3;
	cy=ay+(by-ay)/3;
	ex=bx-(bx-ax)/3;
	ey=by-(by-ay)/3;

	double L=sqrt( ( ex-cx)*(ex-cx)+(ey-cy)*(ey-cy) );
	double alpha=atan(( ey-cy)/(ex-cx));///反正切
	if( (ex-cx)<0){
		alpha+=pi;
	}
	double dy,dx;
	dy=cy+sin(alpha+pi/3)*L;
	dx=cx+cos(alpha+pi/3)*L;
	Koch(ax,ay,cx,cy,c);
	Koch(ex,ey,bx,by,c);
	Koch(cx,cy,dx,dy,c);
	Koch(dx,dy,ex,ey,c);
}
4.2.3:改造的划线函数(画的是加粗的黄线)
void CallView::Line(int ax, int ay, int bx, int by)
{
	CPen pen(PS_SOLID, 10, RGB(255,255,0));//1是笔的宽度, RGB是宏, 用于生成颜色
	CClientDC dc(this);
	dc.SelectObject(pen);

	dc.MoveTo(ax,ay);
	dc.LineTo(bx,by);
}

4.2.4:风车
void CallView::Fengche(int R, int x, int y)
{
	
	///R:风车的长轴
	///int x,y风车的中心点
	///int yDegree:长轴与y轴的夹角
	int yDegree=0;
	double pi=4.0*atan(1.0);
	double rad = pi / 180;                    //每度的弧度值
   double r = R * sin(18 * rad) / cos(36 * rad);    //风车短轴的长度
    POINT RVertex[5], rVertex[5];
    for (int k = 0; k < 5; k++)                //求取坐标
    {
		int lala1=x - (R * cos((90 + k * 72 + yDegree) *rad));
		int lala2=y - (R * sin((90 + k * 72 + yDegree) * rad));
		RVertex[k].x= lala1;
		RVertex[k].y=lala2 ;
		int haha1=x - (r * cos((90 + 36 + k * 72 + yDegree) *rad));
		int haha2=y - (r * sin((90 + 36 + k * 72 + yDegree) * rad));
		
		rVertex[k].x = haha1;
		rVertex[k].y = haha2;
    }
 
    CBrush pNewBrush(RGB(0, 255, 0));
    CBrush pNewBrush1(RGB(0, 255, 0));
 
    for (int i = 0; i < 5; i++)
    {
       POINT polylinepoint[4] = {RVertex[i], rVertex[i], { x, y },RVertex[i] };
       POINT polylinepoint1[4] = {RVertex[(i+1) % 5], rVertex[i], {x, y }, RVertex[(i + 1) % 5] };
	   CPen pen(PS_SOLID, 1, RGB(0,255,0));//1是笔的宽度, RGB是宏, 用于生成颜色
	   CClientDC dc(this);
	   dc.SelectObject(pen);
  dc.SelectObject(pNewBrush1);
      /// dc.Polygon(polylinepoint, 4);
      dc.SelectObject(pNewBrush);
      dc.Polygon(polylinepoint1, 4);
    }
}

另外将LINE()函数变成:

void CallView::Line(int ax, int ay, int bx, int by)

{

CPen pen(PS_SOLID, 100, RGB(255,255,0));//1是笔的宽度, RGB是宏, 用于生成颜色

CClientDC dc(this);

dc.SelectObject(pen);

dc.MoveTo(ax,ay);

dc.LineTo(bx,by);

}

就是加粗后:

会有:

5 图形名:文字

5.2 图形代码
5.2.1主函数:
void CallView::OnWenzi()
{
	board();
	// TODO: 在此添加命令处理程序代码
	Cantor(0,50,500,50);
}

5.2.2创建board效果
void CallView::board(void)
{
	CClientDC dc(this);
////点////绘制点
	dc.SetPixel(10, 20, RGB(255, 0, 0));
	//得到点的颜色
	COLORREF clPixel = dc.GetPixel(10, 20);
		/////线//////绘制线
		dc.MoveTo(0, 0);
		dc.LineTo(100, 100);
		/////////矩形/画刷的使用
		//创建画刷
		CBrush brs;
		brs.CreateHatchBrush(HS_CROSS,RGB(0,255,0));//++类型,绿色画刷
		//载入画刷
		CBrush* pOldBrs = dc.SelectObject(&brs);
		//绘制矩形
		dc.Rectangle(10, 10, 600, 600);
		//载出画刷
		dc.SelectObject(pOldBrs);
		//删除画刷
		brs.DeleteObject();
		////位图的使用/////创建位图
		CBitmap bmpCar;
		//创建内存DC
		CDC MemClientDC;		//位图加载到内存DC上
		MemClientDC.SelectObject(bmpCar);
		//将内存DC绘制到客户区
		dc.BitBlt(0, 0, 1400, 200, &MemClientDC, 0, 0, SRCCOPY);
		//删除内存DC和位图
		MemClientDC.DeleteDC();
		bmpCar.DeleteObject();
 
///////字体的绘制////////创建字体
		CFont font;
		font.CreatePointFont(200, _T("宋体"));
		//载入字体
		CFont* pOldFont;
		pOldFont = dc.SelectObject(&font);
		//绘制字
		dc.TextOutW(150, 150, _T("在路上随便碰到的路人,"));
		dc.TextOutW(150, 200, _T("都是别人做梦都想见到的人,"));
		dc.TextOutW(150, 250, _T("请先说你好。"));


		CFont font2;
		font2.CreatePointFont(50, _T("宋体"));
		//载入字体
		CFont* pOldFont2;
		pOldFont2 = dc.SelectObject(&font);
		//绘制字
		dc.TextOutW(500, 500, _T("~end"));

		//载出字体
		dc.SelectObject(pOldFont);
		//删除字体
		font.DeleteObject();
}

5.2.3 Cantor算法:
void CallView::Cantor(int ax, int ay, int bx, int by)
{
	double c=0.1;///终止递归的小量
	int d=11;///不同层次线之间的距离
	int cx,cy,dx,dy;
	if((bx-ax)<c){
		Line(ax,ay,bx,by);
		return ;
	}
	Line2(ax,ay,bx,by);
	cx=ax+(bx-ax)/3;
	cy=ay+d;
	dx=bx-(bx-ax)/3;
	dy=by+d;
	ay=ay+d;
	by=by+d;
	Cantor(ax,ay,cx,cy);
	Cantor(dx,dy,bx,by);
}

5.2.4:Cantor算法中用的改造的画有颜色的线的算法
void CallView::Line2(int ax, int ay, int bx, int by)
{
	CPen pen(PS_SOLID, 3, RGB(255,255,0));//1是笔的宽度, RGB是宏, 用于生成颜色
	CClientDC dc(this);
	dc.SelectObject(pen);

	dc.MoveTo(ax,ay);
	dc.LineTo(bx,by);
}

 

猜你喜欢

转载自blog.csdn.net/xianpingping/article/details/85010872