版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/xianpingping/article/details/85010872
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);
}