⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9932.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 5 页
字号:
fwrite(& wei,1,1,destfile); 
} 
else 
fwrite(& que,1,1,destfile); //处理英文 
} 
fclose(sourcefile); 
fclose(tabfile); 
fclose(destfile); 
return; 
} 
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。
用同样的方法,我们也可以将GB码转换为BIG5码。

****************************************************************

                   VC: 三维视图绘制与消隐技术 

                         作者: 周坚华 

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

****************************************************************

                       Linux 内核编程风格 

  这篇短小的文章是对Linux内核编程风格的建议.编程风格非常的
个性化,而且,我并不想将我的观点强加给任何人,但是为了变于维护,
我不得不提出这个观点.详情如下: 

  在最开始,我应该写出GNU编程风格的标准而不用理会它.不要理
会他们,它只是一个符号表情而已. 

  好,让我们开始吧! 

  第一章:缩进格式
  Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将
缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定
义为3一样让人难以接受. 

  理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别
是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的
缩进格式使得你对程序的理解更容易. 

  现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80
个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以
上的缩进的时候,你就应该修改你的程序. 

  总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它
能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修
改你的程序. 

  第二章:大符号的位置
  另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不
同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推
荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始
的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所
示: 

  if (x is true) { we do y } 
  
  然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行
的第一位,如下: int function(int x) { body of function } 
  
  所有非正统的人会非难这种不一致性,但是,所有思维正常的人明
白: (第一) K&R是___对___的,(第二)如果K&R不对,请参见第一条. 
(:-))......另外,函数也是特殊的,不一定非得一致. 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -