绘制立体模型
发表在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);
}
。感觉给出的方法对我还是有点难,不够清楚,能不能再具体点。
分享到:
精彩评论 3
明日科技的一个顾客
学分:0 LV1
2015-07-22
沙发
上图
明日科技的一个顾客
学分:0 LV1
2015-07-22
板凳
[FIELDSET][LEGEND]引自:楼主[/LEGEND]
实例程序根据用户指定的长、宽、高、角度来绘制立方体,效果如图
实例是指定长、宽、高来绘制立方体,并没有指定顶点来绘制,所以要将立方体居中显示,所以可以通过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);
}
。感觉给出的方法对我还是有点难,不够清楚,能不能再具体点。
[/FIELDSET]

回复:
  
学分: LV1
TA的每日心情
开心
2020-06-16 09:16:38
2015-07-23
地板
这是哪本书的哪个实例呢?
首页上一页 1 下一页尾页 3 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照