首页上一页 1 下一页尾页 3 条记录 1/1页
绘制立体模型
发表在C语言图书答疑
2015-07-22
是否精华
是
否
版块置顶:
是
否
实例程序根据用户指定的长、宽、高、角度来绘制立方体,效果如图
实例是指定长、宽、高来绘制立方体,并没有指定顶点来绘制,所以要将立方体居中显示,所以可以通过SetViewportOrg函数将设备上下文的顶点移动到窗体中间,设备上下文有两种类型的顶点,一种是窗口顶点,一种是视口顶点,窗口坐标和视口坐标存在一种变换关系,用公式表示如下:
Dx = ((Lx - WOx) * VEx / WEx) + VOx
Dy = ((Ly - WOy) * VEy / WEy) + VOy
(Lx,Ly)是待转换的逻辑点,(Dx,Dy)是转换后的设备点,(WOx,WOy)是逻辑坐标的窗口原点,(VOx,VOy)是设备坐标的视口原点。函数SetViewportOrg可以设置视口坐标,当视口坐标设置在对话框的中心时,坐标(0,0)就会显示在对话框的中心。
实例在绘制立方体内视线条时,使用虚线绘制,虚线的绘制需要在构建CPen对象时指定PS_DOT取值。
(1)创建基于对话框的应用程序。
(2)为长、宽、高、角度编辑框添加成员变量m_length、m_width、m_height、m_angle。
(3)在对话框类的实现文件DrawcudeDlg.cpp中加入对头文件math.h的引用,并通过宏定义常量PI的值。
(4)方法OnButdraw是按钮“绘图”的实现,在该方法内内通过计算得到立方体的各顶点坐标,然后使用CDC类的LineTo方法和Rectangle方法分别进行绘制,实现代码如下:
void CDrawcudeDlg::OnButdraw()
{
CDC* pDC;
pDC = m_palette.GetDC();
CRect rc,rect;
m_palette.GetClientRect(rect);
m_palette.GetWindowRect(rc);
pDC->FillRect(rect,NULL);
//取出中心点
CPoint center;
center.x=rc.Width()/2;
center.y=rc.Height()/2;
pDC->SetViewportOrg(center);//设置视口的坐标
CString slength,swidth,sheight,sangle;
m_length.GetWindowText(slength);//获取用户输入的长度值
m_width.GetWindowText(swidth);//获取用户输入的宽度值
m_height.GetWindowText(sheight);//获取用户输入的高度值
m_angle.GetWindowText(sangle);//获取用户输入的角度
int nlength,nwidth,nheight,nangle;
nlength=atoi(slength);//将字符型数据转换为整型数据
nwidth=atoi(swidth);
nheight=atoi(sheight);
nangle=atoi(sangle);
CPoint LTop,LBottom,RTop,RBottom;
LTop.x=1-nlength/2;//正面左顶点
LTop.y=1-nheight/2;
RTop.x=nlength/2;//正面右顶点
RTop.y=1-nheight/2;
LBottom.x=1-nlength/2;//正面左下点
LBottom.y=nheight/2;
RBottom.x=nlength/2;//正面右下点
RBottom.y=nheight/2;
CPen pen(PS_SOLID,1,RGB(0,0,0));
CPen DOTPen; //虚线
DOTPen.CreatePen(PS_DOT,1,RGB(0,0,0));
pDC->SelectObject(&pen);
//画正面矩形
pDC->Rectangle(LTop.x,LTop.y,RBottom.x,RBottom.y);
CPoint LeftTop,RightTop;
//计算顶面倾斜的直线
LeftTop.x=(long)(LTop.x+(cos(nangle*PI/180)*nwidth));
LeftTop.y=(long)(LTop.y-(sin(nangle*PI/180)*nwidth));
RightTop.x=LeftTop.x+nlength;
RightTop.y=LeftTop.y;
pDC->MoveTo(LTop);
pDC->LineTo(LeftTop);
pDC->LineTo(RightTop);
pDC->LineTo(RTop);
CPoint Other,DotPoint;
DotPoint.x=LeftTop.x ;
DotPoint.y=LeftTop.y+nheight;
pDC->MoveTo(RightTop);
//判断立方体哪条边是虚线
if(nangle<89)//判断角度值
{
pDC->SelectObject(&pen);
Other.x=RightTop.x;
Other.y=RightTop.y+nheight;
pDC->LineTo(Other);
pDC->LineTo(RBottom);
pDC->SelectObject(&DOTPen);
pDC->MoveTo(LeftTop);
pDC->LineTo(DotPoint);
pDC->LineTo(LBottom);
}
else
{
pDC->SelectObject(&DOTPen);
Other.x=RightTop.x;
Other.y=RightTop.y+nheight;
pDC->LineTo(Other);
pDC->LineTo(RBottom);
pDC->SelectObject(&pen);
pDC->MoveTo(LeftTop);
pDC->LineTo(DotPoint);
pDC->LineTo(LBottom);
}
pDC->SelectObject(&DOTPen);
pDC->MoveTo(DotPoint);
pDC->LineTo(Other);
}
。感觉给出的方法对我还是有点难,不够清楚,能不能再具体点。
实例是指定长、宽、高来绘制立方体,并没有指定顶点来绘制,所以要将立方体居中显示,所以可以通过SetViewportOrg函数将设备上下文的顶点移动到窗体中间,设备上下文有两种类型的顶点,一种是窗口顶点,一种是视口顶点,窗口坐标和视口坐标存在一种变换关系,用公式表示如下:
Dx = ((Lx - WOx) * VEx / WEx) + VOx
Dy = ((Ly - WOy) * VEy / WEy) + VOy
(Lx,Ly)是待转换的逻辑点,(Dx,Dy)是转换后的设备点,(WOx,WOy)是逻辑坐标的窗口原点,(VOx,VOy)是设备坐标的视口原点。函数SetViewportOrg可以设置视口坐标,当视口坐标设置在对话框的中心时,坐标(0,0)就会显示在对话框的中心。
实例在绘制立方体内视线条时,使用虚线绘制,虚线的绘制需要在构建CPen对象时指定PS_DOT取值。
(1)创建基于对话框的应用程序。
(2)为长、宽、高、角度编辑框添加成员变量m_length、m_width、m_height、m_angle。
(3)在对话框类的实现文件DrawcudeDlg.cpp中加入对头文件math.h的引用,并通过宏定义常量PI的值。
(4)方法OnButdraw是按钮“绘图”的实现,在该方法内内通过计算得到立方体的各顶点坐标,然后使用CDC类的LineTo方法和Rectangle方法分别进行绘制,实现代码如下:
void CDrawcudeDlg::OnButdraw()
{
CDC* pDC;
pDC = m_palette.GetDC();
CRect rc,rect;
m_palette.GetClientRect(rect);
m_palette.GetWindowRect(rc);
pDC->FillRect(rect,NULL);
//取出中心点
CPoint center;
center.x=rc.Width()/2;
center.y=rc.Height()/2;
pDC->SetViewportOrg(center);//设置视口的坐标
CString slength,swidth,sheight,sangle;
m_length.GetWindowText(slength);//获取用户输入的长度值
m_width.GetWindowText(swidth);//获取用户输入的宽度值
m_height.GetWindowText(sheight);//获取用户输入的高度值
m_angle.GetWindowText(sangle);//获取用户输入的角度
int nlength,nwidth,nheight,nangle;
nlength=atoi(slength);//将字符型数据转换为整型数据
nwidth=atoi(swidth);
nheight=atoi(sheight);
nangle=atoi(sangle);
CPoint LTop,LBottom,RTop,RBottom;
LTop.x=1-nlength/2;//正面左顶点
LTop.y=1-nheight/2;
RTop.x=nlength/2;//正面右顶点
RTop.y=1-nheight/2;
LBottom.x=1-nlength/2;//正面左下点
LBottom.y=nheight/2;
RBottom.x=nlength/2;//正面右下点
RBottom.y=nheight/2;
CPen pen(PS_SOLID,1,RGB(0,0,0));
CPen DOTPen; //虚线
DOTPen.CreatePen(PS_DOT,1,RGB(0,0,0));
pDC->SelectObject(&pen);
//画正面矩形
pDC->Rectangle(LTop.x,LTop.y,RBottom.x,RBottom.y);
CPoint LeftTop,RightTop;
//计算顶面倾斜的直线
LeftTop.x=(long)(LTop.x+(cos(nangle*PI/180)*nwidth));
LeftTop.y=(long)(LTop.y-(sin(nangle*PI/180)*nwidth));
RightTop.x=LeftTop.x+nlength;
RightTop.y=LeftTop.y;
pDC->MoveTo(LTop);
pDC->LineTo(LeftTop);
pDC->LineTo(RightTop);
pDC->LineTo(RTop);
CPoint Other,DotPoint;
DotPoint.x=LeftTop.x ;
DotPoint.y=LeftTop.y+nheight;
pDC->MoveTo(RightTop);
//判断立方体哪条边是虚线
if(nangle<89)//判断角度值
{
pDC->SelectObject(&pen);
Other.x=RightTop.x;
Other.y=RightTop.y+nheight;
pDC->LineTo(Other);
pDC->LineTo(RBottom);
pDC->SelectObject(&DOTPen);
pDC->MoveTo(LeftTop);
pDC->LineTo(DotPoint);
pDC->LineTo(LBottom);
}
else
{
pDC->SelectObject(&DOTPen);
Other.x=RightTop.x;
Other.y=RightTop.y+nheight;
pDC->LineTo(Other);
pDC->LineTo(RBottom);
pDC->SelectObject(&pen);
pDC->MoveTo(LeftTop);
pDC->LineTo(DotPoint);
pDC->LineTo(LBottom);
}
pDC->SelectObject(&DOTPen);
pDC->MoveTo(DotPoint);
pDC->LineTo(Other);
}
。感觉给出的方法对我还是有点难,不够清楚,能不能再具体点。