C++编程绘图.docx
《C++编程绘图.docx》由会员分享,可在线阅读,更多相关《C++编程绘图.docx(17页珍藏版)》请在冰点文库上搜索。
C++编程绘图
VC++编程绘图
16—1编写在屏幕上绘制桁架示意图的程序,不注尺寸,大致安放在屏幕中央。
在voidCMy161View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
inti;
POINTpp[13]={-160,0,-160,-40,-80,0,-80,-80,0,0,80,-80,80,0,160,-40,160,0,240,0,0,-120,-240,0,240,0};
CRectrc;
GetClientRect(&rc);
intx0,y0;
x0=(int)rc.right/2;y0=(int)rc.bottom/2;
pDC->SetViewportOrg(x0,y0);
pDC->MoveTo(pp[0]);
for(i=0;i<13;i++)
pDC->LineTo(pp[i]);
pDC->MoveTo(pp[10]);
pDC->LineTo(pp[4]);
图形输出如下:
16-2:
15个不同颜色和半径的圆彼此相切于公共点(300,100),最小圆的半径为10,其余各圆的半径按级差10递增。
分析圆心的变化规律,并绘制该图的程序。
在voidCMy162View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
CPen*pPen,*pOldPen;
CPointp1(290,100),p2(310,120);
inti;
intrgb[15]={RGB(0,0,0),RGB(0,0,255),RGB(0,0,128),RGB(0,255,0),RGB(0,128,0),RGB(0,255,255),RGB(0,128,128),RGB(255,0,0),RGB(128,0,0),RGB(255,0,255),RGB(128,0,128),RGB(255,255,0),RGB(128,128,0),RGB(128,128,128),RGB(192,192,192)};
for(i=0;i<15;i++)
{
pPen=newCPen(PS_SOLID,0,rgb[i]);
pOldPen=(CPen*)pDC->SelectObject(pPen);
pDC->SelectStockObject(NULL_BRUSH);
pDC->Ellipse(CRect(p1,p2));
p1.Offset(-10,0);
p2.Offset(10,20);
pDC->SelectObject(pOldPen);
deletepPen;
}
输出图形如下:
16-3:
编写绘制五角星的程序,10个顶点的坐标按等分大,小圆周通过计算得到,R1=100,R2=38.2
在voidCMy163View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
doublex[11]={0},y[11]={0};
inti,j;
CRectrc;
GetClientRect(&rc);
pDC->SetViewportOrg(rc.right/2,rc.bottom/2);
for(i=1;i<=9;i+=2)
{x[i]=100*cos(1.5708+(i-1)*2*3.141592654/10);
y[i]=-100*sin(1.5708+(i-1)*2*3.141592654/10);}
x[11]=x[1];y[11]=y[1];
for(j=2;j<=10;j+=2)
{x[j]=38.2*cos(1.5708+(j-1)*2*3.141592654/10);
y[j]=-38.2*sin(1.5708+(j-1)*2*3.141592654/10);}
pDC->MoveTo((int)x[1],(int)y[1]);
for(i=1;i<=11;i++)
pDC->LineTo((int)x[i],(int)y[i]);
for(i=1;i<=5;i++)
{j=i+5;
pDC->MoveTo((int)x[i],(int)y[i]);
pDC->LineTo((int)x[j],(int)y[j]);}
并在程序的预处理部分添加函数头#include"math.h"。
程序图形输出如下:
16-4:
编程绘制钢结构构件断面图程序,不注尺寸.
在voidCMy164View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
intx0,y0,i;
CRectrc;
GetClientRect(&rc);
x0=(int)rc.right/2;
y0=(int)rc.bottom/2;
pDC->SetViewportOrg(x0,y0);
POINTpp[6]={-5,0,-5,-100,5,-100,5,0,85,0,-85,0};
pDC->MoveTo(pp[0]);
for(i=0;i<6;i++)
pDC->LineTo(pp[i]);
CRectr1(-85,-10,-65,10);
CRectr2(65,-10,85,10);
CRectr3(-15,-80,5,-60);
CRectr4(-5,-80,15,-60);
POINTp[8]={-75,-10,-15,-70,-5,-80,5,-80,15,-70,75,-10,-15,-10,15,-10};
pDC->MoveTo(p[0]);
pDC->Arc(r1,p[0],pp[5]);
pDC->MoveTo(pp[4]);
pDC->Arc(r2,pp[4],p[5]);
pDC->MoveTo(p[2]);
pDC->Arc(r3,p[2],p[1]);
pDC->MoveTo(p[4]);
pDC->Arc(r4,p[4],p[3]);
pDC->MoveTo(p[0]);
pDC->LineTo(p[6]);
pDC->LineTo(p[1]);
pDC->MoveTo(p[4]);
pDC->LineTo(p[7]);
pDC->LineTo(p[5]);
图形输出如下:
16-5:
编写月亮门的程序
在voidCMy165View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
CRectrc;
GetClientRect(&rc);
intx0,y0;
x0=(int)rc.right/2;
y0=(int)rc.bottom/2;
pDC->SetViewportOrg(x0,y0);
inti;
POINTp[6]={-82.91561976,-125,-280,-125,-280,100,280,100,280,-125,82.91561976,-125};
pDC->MoveTo(p[0]);
for(i=0;i<6;i++)
pDC->LineTo(p[i]);
CRectr1(-150,-150,150,150);
pDC->MoveTo(p[5]);
pDC->Arc(r1,p[5],p[0]);
POINTpp[4]={-60,80,-60,100,60,100,60,80};
pDC->MoveTo(pp[0]);
for(i=0;i<4;i++)
pDC->LineTo(pp[i]);
CRectr2(-100,-100,100,100);
pDC->MoveTo(pp[3]);
pDC->Arc(r2,pp[3],pp[0]);
图形输出如下:
16-6:
由同心的半圆和椭圆弧组成,设R=70,椭圆长半径为140短半径为50
在voidCMy166View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
CRectrc;
GetClientRect(&rc);
pDC->SetViewportOrg(rc.right/2,rc.bottom/2);
inta,b;
a=140;b=50;
pDC->Arc(-70,70,70,-70,70,0,-70,0);
inti;
doubledt,xf,yf,phi,x,y,theta;
dt=.01745;
x=xp(0);y=yp(0);
pDC->MoveTo(x,y);
for(i=1;i<=360;i++){
phi=i*dt;
xf=a*cos(phi);yf=b*sin(phi);
if(yf<0&&sqrt(xf*xf+yf*yf)<70)
pDC->SelectStockObject(NULL_PEN);
else
pDC->SelectStockObject(BLACK_PEN);
x=xp(phi);
y=yp(phi);
pDC->LineTo(x,y);
}
并在程序预处理理部分添加函数头和宏定义:
#include"math.h"
#definexp(phi)a*cos(phi)
#defineyp(phi)b*sin(phi)
图形输出如下:
16-7:
编程绘制球面及其上均匀分布的经线和纬线的正面投影.
在voidCMy167View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
CRectrc;
GetClientRect(&rc);
intx0,y0,i;
x0=(int)rc.right/2;
y0=(int)rc.bottom/2;
pDC->SetViewportOrg(x0,y0);
doublex1,y1;
x1=100*pow(3,.5)/2;y1=100;
intx2,y2;
x2=(int)x1;y2=(int)y1;
pDC->Ellipse(-100,-100,100,100);
pDC->Ellipse(-x2,-y2,x2,y2);
pDC->Ellipse(-50,-100,50,100);
POINTp[12]={0,100,-50,x2,-x2,50,-100,0,-x2,-50,-50,-x2,0,-100,50,x2,x2,50,100,0,x2,-50,50,-x2};
for(i=0;i<6;i++)
{pDC->MoveTo(p[i]);
pDC->LineTo(p[i+6]);}
并在图形的预处理部分添加函数头#include"math.h"
图形输出如下:
16-8:
在voidCMy168View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
intx0,y0,x,y,s1=120;
doubler,theta;
CRectrc;
GetClientRect(&rc);
x0=rc.right/2;y0=rc.bottom/2;
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetViewportOrg((int)x0,(int)y0);
for(theta=0;theta<20*3.14;theta+=0.2)
{r=R(theta);
x=(int)(r*cos(theta));
y=(int)(r*sin(theta));
pDC->MoveTo(0,0);
pDC->LineTo(x,y);
}
并在程序的预处理部分添加函数头和宏定义:
#include"math.h"
#defineR(theta)cos(1.5*theta)*s1
图形输出如下:
16-9:
对百叶窗正面图的程序进行改造.
在voidCMy169View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
inti;
doubledt=0.01745,x,y,x0,y0,a,b,xc,yc,phi,x1,y1,a1,b1;
phi=45*dt;
CRectrc;
GetClientRect(&rc);
x0=rc.right/2;y0=rc.bottom/2;
pDC->SetViewportOrg((int)x0,(int)y0);
xc=0;yc=0;
pDC->Ellipse(-150,-150,150,150);
pDC->Ellipse(-140,-140,140,140);
for(i=0;i<=6;i++)
{x1=pow((140*140-20*20*i*i),0.5);y1=-20*i;
a1=-x1;b1=y1;
x=xp(x1,y1);y=yp(x1,y1);
a=xp(a1,b1);b=yp(a1,b1);
pDC->MoveTo(x,y);
pDC->LineTo(a,b);
}
for(i=0;i<=6;i++)
{x1=pow((140*140-20*20*i*i),0.5);y1=20*i;
a1=-x1;b1=y1;
x=xp(x1,y1);y=yp(x1,y1);
a=xp(a1,b1);b=yp(a1,b1);
pDC->MoveTo(x,y);
pDC->LineTo(a,b);
}
并在程序的预处理部分添加函数头和宏定义:
#include"math.h"
#definexp(x,y)cos(phi)*x+sin(phi)*y+xc
#defineyp(x,y)cos(phi)*y-sin(phi)*x+yc
程序图形输出如下:
16-10:
错切系数为0.4,试编写根据左图画成右图的程序.
在voidCMy1610View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
inti;
doubles1=1.5,x,x0,y0;
CRectrc;
GetClientRect(&rc);
x0=rc.right/2;y0=rc.bottom/2;
pDC->MoveTo(fnx(0),fny(0,0));
pDC->LineTo(fnx(200),fny(200,0));
pDC->MoveTo(fnx(0),fny(0,65));
pDC->LineTo(fnx(200),fny(200,65));
for(i=1;i<=6;i++)
{x=40*(i-1);
pDC->MoveTo(fnx(x),fny(x,65));
pDC->LineTo(fnx(x),fny(x,-25));}
for(i=1;i<=5;i++)
{x=20+40*(i-1);
pDC->MoveTo(fnx(x),fny(x,65));
pDC->LineTo(fnx(x),fny(x,0));}
并在程预处理部分添加函数头和宏定义:
#include"math.h"
#definefnx(x)(int)(x0+(x)*s1)
#definefny(x,y)(int)(y0-(y+0.4*x)*s1)
程序图形输出如下:
16-11:
编写绘制图形程序.
在voidCMy1611View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
intj;
doubledt=0.01745,s1=1.0,x,y,x0,y0,a,b,c,s,xc,yc,phi,theta,i;
CRectrc;
GetClientRect(&rc);
x0=rc.right/2;y0=rc.bottom/2;
a=100;b=40;xc=0;yc=0;
for(i=0;i<=180;i+=22.5)
{theta=i*dt;
c=cos(theta);s=sin(theta);
x=xp(0);y=yp(0);
pDC->MoveTo(fnx(x),fny(y));
for(j=1;j<=360;j++)
{phi=j*dt;
x=xp(phi);y=yp(phi);
pDC->LineTo(fnx(x),fny(y));}}
并在程序的预处理部分添加函数头和宏定义:
#include"math.h"
#definefnx(x)(int)(x0+(x)*s1)
#definefny(y)(int)(y0-(y)*s1)
#definexp(phi)cos(phi)*a*c-sin(phi)*b*s+xc
#defineyp(phi)cos(phi)*a*s+sin(phi)*b*c+yc
程序输出图形如下:
16-12:
编程绘制大门
在预处理部分添加宏定义:
#definefnx(x)(int)(x0+(x)*s*s1)
#definefny(x)(int)(y0-(x)*s1)
添加变量:
inti,x0,y0,s;
doubles1;
添加函数:
draw();
在自定义函数部分添加程序代码如下:
inti;
CClientDCdc(this);
dc.MoveTo(fnx(0),fny(50));
dc.LineTo(fnx(300),fny(50));
dc.Rectangle(fnx(165),fny(50),fnx(215),fny(250));
dc.Rectangle(fnx(155),fny(250),fnx(225),fny(260));
dc.Arc(fnx(190-25),fny(260-25),fnx(190+25),fny(260+25),x0+300,fny(260),x0-300,fny(260));
dc.MoveTo(fnx(215),fny(55));
dc.LineTo(fnx(300),fny(55));
dc.MoveTo(fnx(215),fny(190));
dc.LineTo(fnx(300),fny(190));
dc.MoveTo(fnx(215),fny(195));
dc.LineTo(fnx(300),fny(195));
for(i=1;i<=4;i++)
{
dc.MoveTo(fnx(215+20*i),fny(55));
dc.LineTo(fnx(215+20*i),fny(190));
}
在voidCMy1612View:
:
OnDraw(CDC*pDC)中添加如下程序代码:
CRectrc;
GetClientRect(&rc);
x0=rc.right/2;
y0=rc.bottom/2+100;
intx,y;
x=x0-50;y=y0-180;
CStringw="欢迎参观指导";
TEXTMETRICtm;
pDC->TextOut(x,y,w);
s=1;s1=.5;
draw();
s=-s;
draw();
程序图形输出如下: