• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
三维视图绘制与消隐技术
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
三维视图绘制与消隐技术
软件发布 三维视图绘制与消隐技术
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 编程技术 >> C/C++教程 >> 三维视图绘制与消隐技术

三维视图绘制与消隐技术

添加时间: 2006-2-15 3:36:21  作者: C++教程  阅读次数:178   来源: http://d9soft.com

        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文件即可。由此可见该程序具有使用灵活,可容绘图数据量大等优点,可用于各种空间分布数据三维视图的绘制,尤其适合于大数据量绘图。

 

上下文章:

 

上一篇文章: 利用MFC实现对象拖放 下一篇文章: MFC类中获得其它类指针

相关文章:

  • 见证浩辰二次开发技术新变革
  • Web2.0专家:经济大萧条对互联网技术的影响
  • 赛门铁克将推新安全技术 准确查出恶意软件
  • Flash鼠绘新手入门教程:绘制清新脱俗的荷花
  • Flash鼠绘新手入门教程:绘制漂亮的梅花

相关软件:

  • Ccproject网络图绘制软件 6.55
  • 计算机等级考试训练模拟软件(三级数据库技术) V1.01
  • 三维智力魔方 1.56
  • 3D Tetrix 三维俄罗斯方块 1.0
  • 三维滑雪游戏(Mediamond Deluxe Ski Jump 3) 1.40
  • 超级三维输入法(视窗万年历+可视化拼音打字练习) 3.00

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • 使用C++ TR1 生成随机数
  • C/C++作用域引申出的编码规范
  • 程序宝典:C++学习感想
  • C语言:黑客学员必修课(一)
  • C语言:黑客学员必修课(二)
  • 使用多线程实现数据实时采集
  • C++编程中的四个调试小技巧
  • C语言程序设计基础之联合
  • 学C++不得不看的一篇文章
  • C,曾经的程序员梦

C/C++教程阅读排行

  • 学C++不得不看的一篇文章
  • 水滴石穿C语言之可变参数问题
  • C语言:黑客学员必修课(一)
  • 我的Visual C++入门之路
  • 程序宝典:C++学习感想
  • C++中的struct专题研究
  • 初学者学习C++的50条忠告
  • C++箴言:只要可能就用const
  • C++编程中的四个调试小技巧
  • 强大的语言——C入门

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • VC++之List Box/Check List Box控...
  • 第二章 PowerBuilder 入门之创建新...
  • VC++ List Ctrl控件
  • 第一章 什么是PowerBuilder
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有