📄 cgdraw2.cpp
字号:
//设置初始参数
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 + -