⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgdraw2.cpp

📁 本上机平台专门为《计算机辅助设计技术基础》课程中的vC语言编程和交互技术与用户接口实验部分设计。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//设置初始参数
	int i,n1,i1,ni1;
	double t,u,q,x,y;
	x=0.0;
	y=0.0;
	t=0.01;
	n1=24;
	i1=1;
	ni1=1;
	POINT point1,point2;
	point1.x=0;
	point1.y=0;
	point2.x=point[0].x;
	point2.y=point[0].y;

	//以t为步长,依次求出对应点坐标,并连接相邻点
	for(i=1;i<100;i++)
	{
		u=t*i;
		q=1-u;
		x=(1-u)*(1-u)*(1-u)*point[0].x+3*u*(1-u)*(1-u)*point[1].x+3*u*u*(1-u)*point[num-2].x+u*u*u*point[num-1].x;
		y=(1-u)*(1-u)*(1-u)*point[0].y+3*u*(1-u)*(1-u)*point[1].y+3*u*u*(1-u)*point[num-2].y+u*u*u*point[num-1].y;
		point1.x=(long)x;
		point1.y=(long)y;
		pDC->MoveTo(point2);
		pDC->LineTo(point1);
		point2.x=point1.x;
		point2.y=point1.y;
		x=0.0;
		y=0.0;
	}


	pDC->LineTo(point[num-1]);
	pDC->MoveTo(point[0]);
	for(i=1;i<=(num-1);i++)
	{
		pDC->LineTo(point[i]);
	}
}

// 作业5:画8*7彩色方格矩形,顺序填充七种颜色.
void CCgDraw::palette(CDC *pDC)
{
	//创建brush数组,分别存储7种不同颜色的brush
	CBrush brush[7]={RGB(200,0,0),RGB(0,200,0),RGB(0,0,200),RGB(0,0,0),RGB(200,200,0),RGB(200,0,200),RGB(0,200,200)};
	int i,j;
	tagRECT Rect;
	
	//绘制方格
	for(i=0;i<=6;i++)
	{
		for(j=0;j<=7;j++)
		 {
			Rect.left=50+50*i;
			Rect.right=100+50*i;
			Rect.top=50+30*j;
			Rect.bottom=80+30*j;
			pDC->FillRect(&Rect,&brush[(i+j)%7]);
		}
	}
}

// 作业6:画一矩形,矩形中画45度剖面线.
//       point[0],point[1]:矩形的两个顶点;
//       dens:剖面线间距.
void CCgDraw::retangle(CDC *pDC, int dens, CPoint *point)
{POINT point1,point2;
 point1.x=point[0].x;
 point1.y=point[1].y;
 point2.x=point[1].x;
 point2.y=point[0].y;
 pDC->MoveTo(point[0]);
 pDC->LineTo(point1);
 pDC->LineTo(point[1]);
 pDC->LineTo(point2);
 pDC->LineTo(point[0]);
 int num=(int)((fabs(point[1].x-point[0].x)+fabs(point[1].y-point[0].y))/dens);
 int i;
 for(i=1;i<=num;i++)
 {if(i*dens<=fabs(point[1].y-point[0].y))
 {point1.x=point[0].x;
 point1.y=point[0].y+i*dens;}
 if(i*dens>fabs(point[1].y-point[0].y))
 {point1.x=(long)(point[0].x+i*dens-fabs(point[1].y-point[0].y));
 point1.y=point[1].y;}
 if(i*dens<=fabs(point[1].x-point[0].x))
 {point2.x=point[0].x+i*dens;
 point2.y=point[0].y;}
 if(i*dens>fabs(point[1].x-point[0].x))
 {point2.x=point[1].x;
 point2.y=(long)(point[0].y+i*dens-fabs(point[1].x-point[0].x));}
 pDC->MoveTo(point1);
 pDC->LineTo(point2);}
	
}

// 作业7:画一有10个顶点的小房子的三视图和透视图
//       Vx,Vy,Vz为透视图的视点
void DrawHouse(CDC *pDC, POINT *pPoint)
{
	int i;
	
	for (i=0; i<=9; i=i+2)
	{
		pDC->MoveTo(pPoint[i].x, pPoint[i].y);
		pDC->LineTo(pPoint[i+1].x, pPoint[i+1].y);
	}
	pDC->MoveTo(pPoint[0].x, pPoint[0].y);
	for (i=2; i<=8; i=i+2)
		pDC->LineTo(pPoint[i].x, pPoint[i].y);
	pDC->LineTo(pPoint[0].x, pPoint[0].y);
	pDC->MoveTo(pPoint[1].x, pPoint[1].y);
	for (i=3; i<=9; i=i+2)
		pDC->LineTo(pPoint[i].x, pPoint[i].y);
	pDC->LineTo(pPoint[1].x, pPoint[1].y);
}

void CCgDraw::house(CDC *pDC, int Vx, int Vy, int Vz)
{

	int i, p[10][3]={{-100,-75,100},{100,-75,100},{-100,0,150},{100,0,150},{-100,75,100},{100,75,100}, 
		{-100,75,0}, {100,75,0},{-100,-75,0}, {100,-75,0}};

	int CenterX = 300, CenterY = 200;
	pDC->MoveTo(10,CenterY); pDC->LineTo(590,CenterY);
	pDC->MoveTo(CenterX,10); pDC->LineTo(CenterX,390);

	POINT Points[10];
	int Tx = 170, Ty = 120, Tz=30;
	///////////////////////////////////////////////////
	// 画主视图
	for (i=0; i<=9; i++)
	{
		Points[i].x = -p[i][0]+CenterX-Tx;
		Points[i].y = -p[i][2]+CenterY-Tz;
	}
	// 画房子
	DrawHouse(pDC, &Points[0]);

	///////////////////////////////////////////////////
	// 画左视图
	for (i=0; i<=9; i++)
	{
		Points[i].x = p[i][1]+CenterX+Ty;
		Points[i].y = -p[i][2]+CenterY-Tz;
	}
	// 画房子
	DrawHouse(pDC, &Points[0]);
	
	///////////////////////////////////////////////////
	// 画侧视图
	for (i=0; i<=9; i++)
	{
		Points[i].x = p[i][0]+CenterX-Tx;
		Points[i].y = p[i][1]+CenterY+Ty;
	}
	// 画房子
	DrawHouse(pDC, &Points[0]);

	///////////////////////////////////////////////////
	// 画透视图
	double vp[10][3], vpa[10][3];
	double dis = sqrt((double)Vx * Vx + (double)Vy * Vy + (double)Vz * Vz);
	if(dis < 0.005) return ;
	double Vl = sqrt((double)Vx * Vx + (double)Vy * Vy);
	// a角表示绕y轴旋转的角度
	double cosa, sina;
	if(Vl > 0.005)
	{
		cosa = -(double)Vy / Vl;
		sina = (double)Vx / Vl;
	}                                
	else
	{
		cosa = 1; sina = 0;
	}
	// b角表示绕x轴旋转的角度
	double cosb = Vl / dis;
	double sinb = (double)Vz / dis;

	// 1. 用户坐标系到观察坐标系的转换
	for (i=0; i<=9; i++)
	{
		p[i][0] = p[i][0] - Vx;
		p[i][1] = p[i][1] - Vy;
		p[i][2] = p[i][2] - Vz;
	}
	// 2. 观察坐标系绕x轴顺时针旋转90度
	for (i=0; i<=9; i++)
	{
		vp[i][0] = p[i][0];
		vp[i][1] = p[i][2];
		vp[i][2] = -p[i][1];
	}

	for(i=0; i<10; i++)
	{
		// 3. 观察坐标系绕y轴顺时针旋转a角,形体为逆时针
		vpa[i][0] = vp[i][0] * cosa - vp[i][2] * sina;
		vpa[i][1] = vp[i][1];
		vpa[i][2] = vp[i][0] * sina + vp[i][2] * cosa;
		// 4. 观察坐标系绕x轴顺时针旋转b角,形体为逆时针
		vp[i][0] = vpa[i][0];
		vp[i][1] = vpa[i][1] * cosb - vpa[i][2] * sinb;
		vp[i][2] = vpa[i][1] * sinb + vpa[i][2] * cosb;
	}
	// 5. 右手坐标系变成左手坐标系,z轴反向
	for (i=0; i<=9; i++)
	{
		vpa[i][0] = vp[i][0];
		vpa[i][1] = vp[i][1];
		vpa[i][2] = -vp[i][2];
	}

	// 6. 透视变换
	int cx= 420, cy=340;	// 屏幕偏移坐标
	int D = 400;
	for(i=0; i<10; i++)
	{
		double dd = fabs(vpa[i][2]);
		if(dd > 0.005)
		{
			Points[i].x = cx + (int) (D * vpa[i][0] / dd);
			Points[i].y = cy - (int) (D * vpa[i][1] / dd);
		}
		else
		{
			Points[i].x = cx; Points[i].y = cy;
		}
	}
	DrawHouse(pDC, &Points[0]);	

}

// 作业8:仿时钟时,分,秒旋转运动的图
void CCgDraw::clock(CDC *pDC, long n)
{
	double PI = 3.1415926535897932384626;
 	pDC->Ellipse(100, 100, 300, 300);
 	
 	double sina, cosa;
 	for(int i=0; i<360; i+=30)
 	{
 		sina = sin(PI * i / 180);
 		cosa = cos(PI * i / 180);
 		pDC->MoveTo(200 + (int)(92. * cosa), 200 - (int)(92. * sina));
 		pDC->LineTo(200 + (int)(97. * cosa), 200 - (int)(97. * sina));
 	}
 	
 	int min = (int) (n % 60);
 	int hou = (int)(n/60) % 60;
 	
 	CPoint pm(200 + int(sin(PI * min / 30) * 90), 200 - int(cos(PI * min / 30) * 90));
 	pDC->MoveTo(200, 200); pDC->LineTo(pm);
 	
 	CPoint ph(200 + int(sin(PI * hou / 30) * 60), 200 - int(cos(PI * hou / 30) * 60));
 	pDC->MoveTo(200, 200); pDC->LineTo(ph);

	
}
void CCgDraw::phong(CDC *pDC)
{
	extern void ShadeSpheres(CDC *pDC);

	ShadeSpheres(pDC);
}
//补充作业1:
//利用OpenGl编写一个立方体转动图,即每次在显示窗口上
//点击鼠标,立方体便绕轴(1.0,1.0,0.0)旋转15度角。
//可以有两种实现方法:
//1.利用VC界面来显示旋转立方体,这需要同学们修改
//  包括CgView.cpp等在内的多个程序
//2.使用C语言来编写拥有独立界面的一个独立程序,
//  编译后产生名为light.exe的文件,替换Debug子目
//  录下原有的light.exe(为空).
//注:为方便同学起见,示范程序使用了第二种方法.
 
//补充作业2:
//鼠标删除,删除指定的矩形区域或椭圆区域
//		point[0],point[1]:规定矩形区域或椭圆区域
//						  的外接矩形
//				   select:为0时删除规定的矩形区域;
//						  为1时删除规定矩形的内接椭圆;
void CCgDraw::mousedelete(CDC *pDC, CPoint *point, int select)
{

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -