精华内容
下载资源
问答
  • VC实现OpenGL三维绘图

    2012-06-28 08:46:42
    VC实现OpenGL三维绘图
  • OpenGL三维绘图vc绘图源码,我看到别人分拉的很高,免费才是硬道理
  • VC中实现OpenGL三维绘图 很好用的 OpenGL 三维绘图 vc
  • VC中实现OpenGL三维绘图 .zip
  • VC中实现OpenGL三维绘图-实例,可运行------------------------------
  • OpenGL三维绘图

    2013-10-09 23:23:40
    VC中实现OpenGL三维绘图,MFC中使用opengl。
  • VC2005下利用OpenGL实现三维绘图

    千次阅读 2007-11-12 15:06:00
    三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。它以高性能的交互式三维图形建模能力和...
    在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、IBM、DEC、Sun、HP等大公司的认同。因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。 

      1、初始化OpenGL绘图环境

      1.1 定义颜色格式和缓冲模式

       OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式(调色板)。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上 Alpha值(表示透明度)。RGB三个分量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们的值成正比。如:(1、1、0)表示黄色,(0、 0、1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活, 而且在阴影,光照,雾化,融合等效果处理中RGBA的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。

      OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。

      设置窗口显示模式函数:

      void auxInitDisplayMode(
        AUX_DOUBLE |   // 双缓存方式
        AUX_RGBA     // RGBA颜色模式
      );

      1.2 设置光源

       OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。全局环境光是一种特殊的环境光,它不来自特于某种定光源,通常做为场景的自然光源。

      指定光源函数:

      void glLightfv(
        Glenum light,  // 光源号
        Glenum pname,  // 指明光源类型:
                 // GL_DIFFUSE 光源为漫射光光源
                 // GL_AMBIENT 光源为环境光光源
                 // GL_SPECULAR 光源为镜面光光源
        const Glfloat* params  // 指向颜色向量的指针
      );

      设置全局环境光函数:

      void glLightModelfv(
        GL_LIGHT_MODEL_ AMBIENT,
        const Glfloat* param  // param:指向颜色向量的指针
      );

      起用光源函数:

      void glEnable(GL_LIGHTING);
      void glEnable(GL_enum cap);  // cap:指明光源号

      1.3 设置材质

       在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此 决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射 光和镜面反射光与材料的环境色,漫反射色和镜面反射色的综合。例如:OpenGL的光源色是(LR、LG、LB),材质色为(MR、MG、MB),那么, 在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR、LG*MG、LB*MB)。

      材质定义函数:

      void glMaterialfv(
        GLenum face,  // 指明在设置材质的哪个表面的颜色。
                // 可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK
        GLenum pname,  // 与光源的pname参数相似
        const float* params  // 指向材质的颜色向量
      );

      1.4 定义投影方式

       也即选择观察物体的角度和范围。由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示 真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影 (Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视 点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。

      定义投影范围(不同的投影方式对应不同函数):

      void glOrtho(
        GLdouble left, GLdouble right,  // (left,bottom,near)及(right,top,far)分别给出正射投
        GLdouble bottom, GLdouble top,  // 影投影范围的左下角和右上角的坐标。
        GLdouble near,GLdouble far);

      2、定义与Windows接口的系统函数

      2.1 定义绘图窗口的位置

      // (x,y)给出窗口左上角坐标
      // width及heigh给出窗口的宽高
      void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);

      2.2 定义绘图窗口的标题

      // STR表示窗口标题字串
      void auxInitWindow(GLbyte* STR);

      2.3 定义绘图窗口改变时的窗口刷新函数

      // 当窗口改变形状时调指定的回调函数
      // NAME表示回调函数名称
      void auxReshapeFunc(NAME);

      2.4 定义空闲状态的空闲状态函数以实现动画

      // 当系统空闲时调用指定的回调函数
      // NAME表示回调函数名称
      void auxIdleFunc(NAME);

      2.5 定义场景绘制函数(当窗口更新或场景改变时调用)

      // 当窗口需要更新或场景变化时调用
      // NAME表示回调函数名称
      void auxMainLoop(NAME);

      3、在VC下实现程序编译

       在VC编辑器下键入下述代码后,保存为后缀是.cpp的C++文件。开始编译,在“The build command requires an active project workspace”。“Would you like to create a default project workspace”? 的提示后,选择“是(Y)”。进入“Project”菜单,选择“Setting”项,弹出“Project Setting”对话框,选择“Link”项,在“Libaray”栏目中加入OpenGL提供的函数库:“opengl32.lib glu32.lib glaux.lib”。(注意:在执行程序时,Windows的system目录下要包含opengl32.dll及glu32.dll两个动态连接 库)。附源程序代码:

    #include "windows.h"
    #include "gl/gl.h"
    #include "gl/glaux.h"
    #include "gl/glu.h"
    #include "math.h"
    void myinit()
    {
     glClearColor(1,1,0,0);
     GLfloat ambient[]={.5,.5,.5,0};
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
     GLfloat mat_ambient[]={.8,.8,.8,1.0};
     GLfloat mat_diffuse[]={.8,.0,.8,1.0};
     GLfloat mat_specular[]={1.0,.0,1.0,1.0};
     GLfloat mat_shininess[]={50.0};
     GLfloat light_diffuse[]={0,0,.5,1};
     GLfloat light_position[]={0,0,1.0,0};
     glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
     glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
     glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
     glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
     glLightfv(GL_LIGHT0,GL_POSITION, light_position);
     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT0);
     glDepthFunc(GL_LESS);
     glEnable(GL_DEPTH_TEST);
    }

    void CALLBACK display()
    {
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     auxSolidSphere(1.0); // 绘制半径为1.0的实体球
     glFlush(); // 强制输出图像
     auxSwapBuffers(); // 交换绘图缓存
     Sleep(100);
    }

    void CALLBACK Idledisplay()
    {
     // x,y满足x2+y2=0.01。这样可以使物体沿该圆轨迹运动。
     static float x=-.1,y=0.0;
     static BOOL mark=TRUE;
     static float step=.01;
     x+=step;
     if(x<=.1&&x>=-.1)
     {
      if(step>0)
       y=sqrt(.01-x*x);
      else
       y=-sqrt(.01-x*x);
       glTranslatef(x,y,0);
     }
     else
     {
      step=0-step;
     }
     display();
    }

    void CALLBACK myReshape(GLsizei w,GLsizei h)
    {
     glViewport(0,0,w,h);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     if(w<=h)
      glOrtho(-3.5,3.5,-3.5*(GLfloat)w/(GLfloat)h, 3.5*(GLfloat)w/(GLfloat)h,-10,10);
     else
      glOrtho(-3.5*(GLfloat)w/(GLfloat)h,3.5* (GLfloat)w/(GLfloat)h,-3.5,3.5,-10,10);
      glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
    }

    void main()
    {
     auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);
     auxInitPosition(0,0,400,400);
     auxInitWindow(" circle ");
     myinit();
     auxReshapeFunc(myReshape);
     auxIdleFunc(Idledisplay);
     auxMainLoop(display);
    }

      在Visual C++ 2005下编译

      cl a.cpp /linkopengl32.lib glu32.lib glaux.lib user32.lib gdi32.lib kernel32.lib advapi32.lib 
    展开全文
  • 利用OpenGL实现三维绘图 1 初始化OpenGL绘图环境 2 定义与Windows接口的系统函数 3 在VC下实现程序编译
  • OpenGL三维绘图实例 vc6.0 源码
  • 使用win7 64位OS,VS2005 对之前VC版本的代码进行修改以实现适应性,实现三维图旋转,
  • VC: 三维视图绘制与消隐技术

    千次阅读 2001-07-24 08:20:00
    VC: 三维视图绘制与消隐技术 周坚华 (11/03/1999) 1. 问题的提出 在一些数据库管理系统或办公自动化和统计类软件中,一般具有绘制三维视图的功能。使用时通常要求在给出的表格中输入绘图的数据及视角、比例尺等参数...
    VC: 三维视图绘制与消隐技术

    周坚华 (11/03/1999)

        1. 问题的提出

      在一些数据库管理系统或办公自动化和统计类软件中,一般具有绘制三维视图的功能。使用时通常要求在给出的表格中输入绘图的数据及视角、比例尺等参数。这只适用于小批量的统计数据绘制统计三维视图。在地质、地貌、气象、水文、交通、林业等许多领域,需要描述的某一量通常具有空间分布特征,这种空间分布数据的数量一般十分庞大,当使用上述三维视图软件绘图时经常会遇到输数表格容纳不下的问题,而且按表格重新输入数据也容易出错和耗费许多人力。

      三维视图的绘制及相应绘图数据的组织并不是一件十分困难的事,使用少量程序代码就可以实现这一目标。本文将介绍一种以C++语言实现大批量数据绘制三维视图的简易方法。该法的关键技术在于:(1)以FoxPro数据库管理系统整理绘图数据并制成可为C++语言包括和调用的.h文件;(2)在绘制三维视图中,以“多边形法”进行需遮蔽线段的消隐。

      2. 绘图数据的准备

      绘图的原始数据来自FoxPro(或FoxBase)数据库管理系统。可以将某幅图的数据置于一个一维数组中,并包括在一个.h文件中。这样只要在C++的绘三维视图程序首包括该头文件,就可以在程序的任何位置调用这些数据。例如有一个数据串:3,8,10,11,27,6,……,设存放数组为A,数据文件名为data.h,在data.h中,该数据串的存放形式为:

      A={ 3,8,10,11, 27, 6, : :};

      这些数据可由FoxPro的.dbf文件拷贝得到。当然,在拷贝前还需经过简单的加工。设在.dbf文件中,待绘图数据所在的字段为DT1,此时可增设一个字段DH(逗号),并将该字段的内容全以“,”替换,然后以如下命令拷贝到data.h文件中: copy to data.h field DT1,DH dele with blank 随后打开data.h文件,在数据首加上“A={”,在数据尾加上“ };”即可。

      3. 绘三维视图编程基本思想

      绘三维视图的关键技术在“消隐”,即消去在三维观察时应该被挡住看不见的线。在有关“计算机图形学”的书籍中所介绍的消隐法多为“计算法”,即由当前数据点行计算在已绘出的线条中哪些应该隐去,再清除这些线条。笔者自己设计了一种简便新颖的消隐法(这里姑且称之为“多边形法”),不仅程序代码简单,而且这种消隐法的原理也十分简洁明了。现将其基本思想及运算步骤介绍如下:

      3.1 首排数据绘X方向网线。以line函数将首排数据点连线;

      3.2 绘Y方向网线。将第2排与第1排在Y方向相对应的数据点连线;

      3.3 以“多边形法”做消隐。据第2排点的数据以背景色涂刷一个多边形,这样,可能被第2排数据点连线所遮蔽的线条(即应消隐的线)即被擦除;

      3.4 第2排数据绘X方向网线。以line函数将第2排数据点连线;

      3.5 重复步骤3.2~3.4,直至绘完全图。

       4. 绘三维视图源程序(for Windows)

      draw3d.cpp

      #include

      #include "data.h"

      int PASCAL WinMain (HANDLE, HANDLE, LPSTR, int);

      long FAR PASCAL WindowProc (HWND, WORD, WORD, LONG);

      int mv[15625]; // mv[ ] 为绘图数据数组,存于data.h中

      HANDLE hInst;

      int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,

      LPSTR lpszCmdLine, int nCmdShow)

      {

      …… //此处略去了创建窗口的代码块

      }

      long FAR PASCAL WindowProc (HWND hWnd, WORD message,

      WORD wParam, LONG lParam)

      {

      HDC hDC;

      PAINTSTRUCT ps;

      HBRUSH hOldBrush;

      int i=0,j=0;

      int yy[MAXPTS]; //MAXPTS为绘图行或列数,在data.h中定义

      static POINT PointTable[MAXPTS+2];

      switch (message)

      { // 定义画笔或画刷

      static LOGPEN lpBlack={PS_SOLID,1,1,RGB(0,0,0)};

      static LOGPEN lpGreen={PS_SOLID,1,1,RGB(0,255,0)};

      static LOGPEN lpWhite={PS_SOLID,1,1,RGB(255,255,255)};

      HBRUSH hBlackBrush;

      HBRUSH hWhiteBrush;

      HPEN hGreenPen;

      HPEN hWhitePen;

      HDC hDC;

      PAINTSTRUCT PtStr;

      LoadString (hInst, IDS_CAPTION, szCaption, 35);

      return 0;

      case WM_PAINT:

      hDC = BeginPaint (hWnd, &PtStr);

      SetMapMode(hDC,MM_TEXT);

      hBlackPen=CreatePenIndirect(&lpBlack);

      hGreenPen=CreatePenIndirect(&lpGreen);

      hWhitePen=CreatePenIndirect(&lpWhite);

      hBlackBrush=GetStockObject(BLACK_BRUSH);

      hWhiteBrush=GetStockObject(WHITE_BRUSH);

      hOldBrush = SelectObject (hDC,GetStockObject (NULL_BRUSH));

      {

      yy[j]=MOVE+j*SCALE1; //MOVE为绘图起始点Y坐标,在data.h中定义

      for(i=0;i

      {

      PointTable[i].x=i*SCALE2+j*SCALE4; // 形成多边形顶点数组

      PointTable[i].y=yy[j]-(PointTable[i].x-PointTable[0].x)*ANGLE-(mv[j*MAXPTS+i]*SCALE3); //SCALE2和SCALE4分别为X和Y方向的缩放系数

      if(j>0) //SCALE3为绘图数据(Z方向)的缩放系数

      { //ANGLE为视角,均在data.h中定义

      SelectObject(hDC,hGreenPen);

      MoveTo(hDC,mx[i],my[i]);

      LineTo(hDC,PointTable[i].x,PointTable[i].y); // 绘 y 方 向 网 线

      }

      }

      PointTable[MAXPTS].x=PointTable[MAXPTS-1].x;

      PointTable[MAXPTS].y=PointTable[MAXPTS-1].y+20;

      PointTable[MAXPTS+1].x=PointTable[0].x;

      PointTable[MAXPTS+1].y=PointTable[0].y+20;

      if(j==(MAXPTS-1))

      {

      SelectObject(hDC,hWhitePen);

      SelectObject(hDC,hWhiteBrush);

      Polygon(hDC,PointTable,MAXPTS); // 消 隐

      }

      else

      {

      SelectObject(hDC,hBlackPen);

      SelectObject(hDC,hBlackBrush);

      Polygon(hDC,PointTable,MAXPTS); // 消 隐

      }

      for(i=0;i

      {

      mx[i]=PointTable[i].x; //将前排点数据存于mx[i] my[i],

      my[i]=PointTable[i].y; // 留待绘y方向网线

      }

      for(i=0;i<(MAXPTS-1);i++)

      {

      SelectObject(hDC,hGreenPen);

      MoveTo(hDC,PointTable[i].x,PointTable[i].y);

      LineTo(hDC,PointTable[i+1].x,PointTable[i+1].y);// 绘 x方向网线

      }

      }

      SelectObject (hDC, hOldBrush);

      EndPaint (hWnd, &PtStr);

      return 0;

      case WM_DESTROY:

      ostQuitMessage (0);

      return 0;

      default:

      break;

      }

      return DefWindowProc (hWnd, message, wParam, lParam);

      }

      5. 结论

      绘图数据及缩放、视角等参数皆存于data.h文件中,或在该文件中说明,所以当绘图参数等内容变化时,只要修改或重新制作data.h文件即可。由此可见该程序具有使用灵活,可容绘图数据量大等优点,可用于各种空间分布数据三维视图的绘制,尤其适合于大数据量绘图。

    展开全文
  • VC 6.0 源码演示3D几何图形的绘制,程序包含了显示类中二维显示和三维显示的关键技术,可能与论文中的内容稍微不同,但是实质完全一样。程序在VC6.0下调试通过。显示类的定义部分在eidterView.h 文件中.  其实现...
  • CAD控件 出三维控件!和手机CAD控件了,欢迎大家使用!(下载地址:百度搜索,梦、想。CAD控件) 支持文档格式,igs,stl,dwg,m3d等通用标准的3d文件格式 ...兼容二维绘图功能 使用vc2010开发 转载于:ht...

    CAD控件 出三维控件!和手机CAD控件了,欢迎大家使用!
    (下载地址:百度搜索,梦、想。CAD控件)

    1. 支持文档格式,igs,stl,dwg,m3d等通用标准的3d文件格式

    2. 支持常见的三维实体建模

    3. 支持,旋转,沿路径,拉伸,偏移等方式建模

    4. 支持bool运算方式建模

    5. 支持32,64位系统,支持网页使用,提供ocx方式接口

    6. 兼容二维绘图功能

    7. 使用vc2010开发

    转载于:https://blog.51cto.com/10455293/2088403

    展开全文
  • Surfer绘图教程

    2015-07-24 20:33:53
    软件名称,是美国Golden Software 公司编制的一款以画三维图(等高线,image map, 3d surface)的软件。该软件具有的强大插值功能和绘制图件能力,使它成为用来处理XYZ数据的首选软件,是地质工作者必备的专业成图...
  • 计算机图形学VC源码

    2012-03-02 14:47:16
    二维图形变换算法,三维变换算法;曲线和曲面算法(梅花线,圆柱螺线,圆锥螺线,三次贝塞尔曲线,三次B样条曲线;环形面,锥面,双线性曲面,旋转曲面,贝塞尔曲面,B样条曲面),还包括了一个简单的CAD绘图系统。
  • VC调用打开avi视频

    2011-06-02 19:05:55
    VC只能打开无损无压缩的AVI视频,其它格式请用专门的视频转换器,进行转换。本程序为钻机的动作演示程序,可实现钻机前进 后退 钻进等功能的演示。由于无损AVI视频太大,本...视频由solidworks三维机械绘图软件生成。
  • VC_与OpenGL混合编程实现三维图形处理.pdf VC_中MFC框架技术探索.pdf VC_中利用DirectX实现3DS文件的读取和控制.pdf VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多...
  • VC_与OpenGL混合编程实现三维图形处理.pdf VC_中MFC框架技术探索.pdf VC_中利用DirectX实现3DS文件的读取和控制.pdf VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多...
  • VC_与OpenGL混合编程实现三维图形处理.pdf VC_中MFC框架技术探索.pdf VC_中利用DirectX实现3DS文件的读取和控制.pdf VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多...
  • VC_与OpenGL混合编程实现三维图形处理.pdf VC_中MFC框架技术探索.pdf VC_中利用DirectX实现3DS文件的读取和控制.pdf VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多...
  • 在“浅析VC与Matlab联合编程...但是matcom在很多方面也有限制,比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。 实际上VC与matlab的接口实现方法有很多种,matcom只是其中一
     在“浅析VC与Matlab联合编程<一>”和“浅析VC与Matlab联合编程<二>”中介绍了matcom,这个工具可以将用matlab写的m文件翻译成C++文件,或者是可执行文件(exe)或库文件(dll)。但是matcom在很多方面也有限制,比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。
      实际上VC与matlab的接口实现方法有很多种,matcom只是其中一种,本文再介绍一种比较容易实现的方法:COM接口方法。COM(Compponent Object Model组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab下做COM组件,以及如何在VC中调用COM组件。
      首先在Matlab编辑器里编辑m函数文件:启动matlab->File->New->M-file 函数内容如图1:该函数无输入输出参数,文件保存为huatu.m。


    图1 m函数huatu.m

    在matlab下建立COM组件,步骤如下:
    1、在matlab command window 输入如下命令:
    >> comtool
    出现com编辑界面,如图2:


    图2 com组件编辑界面

    2、新建工程:File->New Project…,如图3。

    图2 com组件属性设置

    3、设置组件属性,在"Component name"项中填写组件名称"component",这时候会自动生成类"component",在"Class name"项中填写类名称"huatu",如图4,

    图4 com组件属性设置1

      为了便于区分,选中"Classes"中的"component",点击“remove”按钮,将类component移除,再点击"Add>>"添加新类huatu,结果如图5。点击"OK",接下来出现一个对话框,选择"Yes".

    图5 com组件属性设置2

    4. 添加文件:选中左边工作区的"huatu",点击Project->Add File…,选择已经编辑好的函数文件huatu.m,如图6。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。

    图6 添加m文件

    5、生成 com组件:点击Build->COM Object…,结果如图7。

    图7

    com组件已经由matlab做好,默认的保存位置为:matlab安装位置/work/component。

    VC中调用COM组件,步骤如下:
    1、在VC中建立名为ComHuaTu的基于对话框的MFC(exe)。
    2、面板上添加一个名为“画图”的button按钮,如图8。


    图7 工程界面

    3、将component_idl.h 和component_idl_i.c文件拷贝到VC建立的工程ComHuaTu目录下。两文件默认目录为/work/component/src
    4、将上面两文件加入工程:工程->添加工程->Files,选择刚刚拷到目录下的component_idl.h 和component_idl_i.c文件。
    5、将目录/extern/include/下的mwcomtypes.h拷贝到工程ComHuaTu目录下,并加入到工程中,方法同上。
    6、为程序添加头文件component_idl.h 、component_idl_i.c和mwcomtypes.h,结果如图9

    图9 添加头文件


     
    7、按钮画图函数添加代码:

    图10 添加按钮函数代码

    函数代码的意义涉及到COM,正在写VC调用COM组件所涉及到的有关COM方面的知识。
    8、设置预编译头文件:工程->设置(快捷键Alt+F7),选择C/C++项precomplied Headers,设置如图11

    图11 预编译头文件设置

    9、编译、连接、运行,结果如图12。

    图11 运行结果

      可以看出利用VC调用com组件的方式来调用matlab比较简单,而且几乎支持matlab所有的函数,在m文件较大、用matcom、调用math library或使用mcc方式无法实现的时候,推荐使用。需要说明的是,以上程序拷到另一台机器上是无法直接运行的,因为COM组件没有新机器上注册,如果要在另一台机器上使用的话,还需要打包安装COM组件,并且由于本程序代码很简单,所以也就不提供源程序了,自己可以动手做一下。
      本人正在写一本关于VC和matlab接口方面的书,估计年底完稿,详细介绍VC和matlab接口的几种方法,并提供详细的例子,例子都是我自己写过的,欢迎大家提供些好的意见和建议。
    展开全文
  • 5.1 三维图形几何变换矩阵 107 5.2 三维图形基本变换矩阵 107 5.2.1 平移变换 107 5.2.2 比例变换 108 5.2.3 绕坐标轴的旋转变换 109 5.2.4 对称变换 110 5.2.5 错切变换 112 5.3 图形的投影变换 113 5.3.1 投影变换...
  • 图像处理OPENGL

    2010-09-15 17:28:11
    OPENGL和VC结合实现的图像处理程序,实现三维绘图
  • MFC和MATLAB混合编程

    热门讨论 2009-04-01 15:47:33
    本程序详细的实现了如何在VC下面调用Matlab函数进行三维绘图
  • OpenGL 开发资料

    2003-11-01 00:00:00
    游戏开发者必备之参考指南 OpenGL入门介绍 目 录  1 基本简介 ...利用OpenGL实现三维绘图  目 录  1 初始化OpenGL绘图环境  2 定义与Windows接口的系统函数  3 在VC下实现程序编译

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

vc三维绘图