博文

ArcGIS安装中的几个小问题(2008-05-22 22:46:00)

摘要:1.注意破解license,不多说   2.注意空间,一般C盘给出2.1G   3.注意如果安装desktop时出错,“我的电脑”右键,切换到“高级”,单击“设置”按钮,然后“编辑”按钮,会打开一个记事本:   [operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"...... 凡是操作系统省略号那个部分,全部删除,然后保存,重启后再安装desktop就可以搞定。......

阅读全文(3968) | 评论:0

3D中的方位和角位移(2)(2008-05-04 17:41:00)

摘要:另一种描述方位的常用方法是欧拉角,这项技术以著名的数学家Leonhard Euler(1707 - 1783)的名字命名,他证明了角位移序列等价于单个角位移。   什么是欧拉角 欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。这听起来很复杂,其实它是非常直观的(事实上,易于使用正是它的主要优点之一)。之所以有"角位移"的说法正是因为欧拉角能用来描述任意旋转。 欧拉角将方位分解为绕三个互相垂直轴的旋转,那么是哪三个轴?按什么顺序?其实,任意三个轴和任意顺序都可以,但最有意义的是使用笛卡尔坐标系并按一定顺序所组成的旋转序列。最常用的约定是所谓的"heading - pitch - bank"约定。在这个系统中,一个方位被定义为一个heading角,一个pitch角,一个bank角。它的基本思想是让物体开始于"标准"方位 --- 就是物体坐标轴和惯性坐标轴对齐。在标准方位上,让物体作heading、pitch、bank旋转,最后物体到达我们想要描述的方位。 如图10.4所示,此时物体坐标系和惯性坐标系重合,heading为绕y轴的旋转量,向右旋转为正(如果从上面看,旋转正方向就是顺时针方向)。 经过heading旋转后,pitch为绕x轴的旋转量,注意是物体坐标系的x轴,不是原惯性坐标系的x轴。依然遵守左手法则,向下旋转为正,如图10.5所示:
最后,经过了heading和pitch,bank为绕z轴的旋转量。再次提醒,是物体坐标系的z轴,不是原惯性坐标系的z轴。依据左手法则,从原点向+z看,逆时针方向为正。如图10.6所示: 记住,当我们说旋转的顺序是heading-pitch-bank时,是指从惯性坐标系到物体坐标系。如果从物体坐标系变换到惯性坐标系,旋转的顺序就是相反的。"heading-pitch-bank"也叫作"roll-pitch-yaw",roll类似于bank,yaw类似于heading(事实上,yaw并不严格等于heading)。注意,在roll-pitch-yaw系统中,角度的命名顺序与从物体坐标系到惯性坐标系的旋转顺序一致的。   关于欧拉角的其他约定 heading-pitch-bank系统不是唯一的欧拉角系统。绕任意三个互相垂直轴的任意旋转都能定义一个方位,所以多种......

阅读全文(6891) | 评论:2

3D中的方位和角位移(1) (2008-05-04 17:40:00)

摘要:什么是方位 直观地说,我们知道物体的“方位”主要描述的是物体的朝向。然而“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,区别在于,当一个向量指向特定方向时,可以让向量自转(如图10.1所示),但向量(或者说它的方向)却不会有任何变化,因为向量的属性只有“大小”,而没有“厚度”和“宽度”。 然而,当一个物体朝向特定的方向时,让它和上面的向量一样自转,你会发现物体的方位改变了,如图10.2所示: 从技术角度来讲,这就说明在3D中,只要用两个数字(例如:极坐标),就能用参数表示一个方向(direction)。但是,要确定一个方位(orientation),却至少需要需要三个数字。 我们知道不能用绝对坐标来描述物体的位置,要描述物体的位置,必须把物体放置于特定的参考系中。描述位置实际上就是描述相对于给定参考点(通常是坐标系的原点)的位移。 同样,描述物体方位时,也不能使用绝对量。与位置只是相对已知点的位移一样,方位是通过与相对已知方位(通常称为"单位"方位或"源"方位)的旋转来描述的。旋转的量称作角位移。换句话说,在数学上描述方位就等价于描述角位移。 "方位"和"角位移"的区别就像"点"和"向量"的区别 ---- 两个术语都只是在数学上等价而在概念上是不同的。方位和点主要用来描述一个单一的状态,而角位移和向量描述的是两个状态间的差别。具体来说,我们用矩阵和四元数来表示"角位移",用欧拉角来表示" 方位"。   矩阵形式 3D中,描述坐标系中方位的一种方法就是列出这个坐标系的基向量,这些基向量是用其他的坐标系来描述的。用这些基向量构成一个3x3矩阵,然后就能用矩阵形式来描述方位。换句话说,能用一个旋转矩阵来描述这两个坐标系之间的相对方位,这个旋转矩阵用于把一个坐标系中的向量转换到另外一个坐标系中,如图10.3所示: 我们通过描述一个坐标系到另一个坐标系的旋转(无论采用哪种变换)来确定一个方位。矩阵变换的具体方向是一个实现细节,因为旋转矩阵是正交的,如果必要的话,只需简单的转置就可求得逆变换。   矩阵形式的优点 矩阵是一种非常直接的描述方位的形式,这种直接性带来了如下优点: (1)可以立即进行向量的旋转。矩阵形式最重要的性质就是利用矩阵能在物体和惯性坐标系间旋转向量,这是其他描述方位所做不到的。为了旋转......

阅读全文(3395) | 评论:0

(OPENGL编程指南第四版)OPENGL范例程序9.3(2008-04-04 13:16:00)

摘要:// 范例P257.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <gl/glut.h> #define checkImageWidth 64
#define checkImageHeight 64
#define subImageWidth 16
#define subImageHeight 16 static GLubyte subImage[subImageWidth][subImageHeight][4];
static GLubyte checkImage[checkImageWidth][checkImageHeight][4]; static GLuint texName; static GLuint CoordX,CoordY; void makeCheckImage(void)
{
 int i,j,k,c;  for(i=0;i<checkImageWidth;i++)
  for(j=0;j<checkImageHeight;j++)
  {
   c=(((i&0x8)==0)^((j&0x8)==0))*255;
   for(k=0;k<3;k++)
    checkImage[i][j][k]=(GLubyte)c;
   checkImage[i][j][3]=(GLubyte)255;
  }  for(i=0;i<subImageWidth;i++)
  for(j=0;j<subImageHeight;j++)
  {
   c=(((i&0x4)==0)^((j&0x4)==0))*255;
 &......

阅读全文(3549) | 评论:0

(OPENGL编程指南第四版)OPENGL范例程序9.1(2008-04-03 21:11:00)

摘要:// 范例P250.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <gl/glut.h> #define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageWidth][checkImageHeight][4]; static GLuint texName; void makeCheckImage(void)
{
 int i,j,c;  for(i=0;i<checkImageWidth;i++)
  for(j=0;j<checkImageHeight;j++)
  {
   c=(((i&0x8)==0)^((j&0x8)==0))*255;
   for(int k=0;k<3;k++)
    checkImage[i][j][k]=(GLubyte)c;
   checkImage[i][j][3]=(GLubyte)255;
  }
}
void display()
{
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glColor3f(1.0,1.0,1.0);       //设置画笔白色
 
 glEnable(GL_TEXTURE_2D);
 glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
 glBindTexture(GL_TEXTURE_2D,texNa......

阅读全文(2709) | 评论:0

(OPENGL编程指南第四版)OPENGL范例程序7.5(2008-03-30 20:02:00)

摘要:// 范例P195.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include "string.h"
#include <gl/glut.h> #define PT 1          //一点
#define STROKE 2         //一画
#define END 3          //结束 // 字体结构体
typedef struct charpoint{
 GLfloat x,y;
 int type;
}CP; //具体字体描述笔画 CP Adata[]={
 {0,0,PT},{0,9,PT},{1,10,PT},{4,10,PT},{5,9,PT},
 {5,0,STROKE},{0,5,PT},{5,5,END}
}; CP Cdata[]={
 {5,0,PT},{1,0,PT},{0,1,PT},{0,9,PT},{1,10,PT},{5,10,END}
}; CP Ddata[]={
 {0,0,PT},{0,10,PT},{3,10,PT},{4,8,PT},{4,2,PT},{3,0,PT},{0,0,END}
}; CP Edata[]={
 {5,0,PT},{0,0,PT},{0,10,PT},{5,10,STROKE},
 {0,5,PT},{4,5,END}
}; CP Pdata[]={
 {0,0,PT},{0,10,PT},{4,10,PT},{5,9,PT},{5,6,PT},
 {4,5,PT},{0,5,END}
}; CP Rdata[......

阅读全文(3005) | 评论:0

VC中的Custom Wizard(2008-03-28 18:42:00)

摘要:      VC中怎样快速生成一个与现有项目除了项目名外完全相同的新项目 ? “文件”,“新建”,“Custom AppWizard” ,选择 An existing Project ,然后选择现有项目的项目文件名(*.dsp),编译后就生成一个可以生成与现有项目相同但可以重新取名的项目的AppWizard。编译后你可以象用MFC AppWizard一样用它。下次新建项目的时候,就可以看到有刚才那个项目中,如下图所示:     如果不想用了,可以在VC 安装目录下Common\MSDev98\Template目录中删除该Wizard中.awx和 .pdb文件。   ......

阅读全文(3928) | 评论:0

(OPENGL编程指南第四版)OPENGL范例程序7.1(2008-03-27 13:17:00)

摘要:// 范例P185.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <gl/glut.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h> #define M_PI 3.1415926 GLuint theTorus; /*绘制一个圆环*/
static void torus(int numc,int numt)
{
 int i,j,k;
 double s,t,x,y,z,twopi;
 
 twopi=2*(double)M_PI;
 for(i=0;i<numc;i++)
 {
  glBegin(GL_QUAD_STRIP);
  for(j=0;j<=numt;j++)
  {
   for(k=1;k>=0;k--)
   {
    s=(i+k)%numc+0.5;
    t=j%numt;     x=(1+0.1*cos(s*twopi/numc))*cos(t*twopi/numt);
    y=(1+0.1*cos(s*twopi/numc))*sin(t*twopi/numt);
    z=0.1*sin(s*twopi/numc);
    glVertex3f(x,y,z);
   }
  }
  glEnd();
&......

阅读全文(2318) | 评论:0

(OPENGL编程指南第四版)OPENGL范例程序5.8(2008-03-24 20:04:00)

摘要:// 范例P140.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <gl/glut.h> void display()
{
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);     //清除所有像素
 
 //材质设置  //四列之间的镜面反射色不同
 GLfloat mat_specular[][4]={1.0,1.0,1.0,1.0, 0.0,0.0,0.0,1.0};
 //四列之间的光洁度不同
 GLfloat mat_shininess[3]={0,5,100};
 //三行之间的环境光反射不同
 GLfloat mat_ambient[][4]={0.0,0.0,0.0,1.0, 0.7,0.7,0.7,1.0, 0.8,0.8,0.2,1.0};
 //散射光颜色全部相同
 GLfloat mat_diffuse[]={0.1,0.5,0.8,1.0};
 //第四列能够发光
 GLfloat mat_emission[][4]={0.3,0.2,0.2,0.0, 0.0,0.0,0.0,1.0};  glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
 for(int i=0;i<3;i++)
 {
  glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient[i]);
  for(int j=0;j<4;j++)
  {
   if(j==0||j==4)
    glMaterialfv(GL_FRONT......

阅读全文(2793) | 评论:0

(OPENGL编程指南第四版)OPENGL范例程序5.3(扩展版)(2008-03-23 21:24:00)

摘要:// 范例P124.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <gl/glut.h> static int spin=0; void display()
{
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);     //清除所有像素  GLfloat light_position[]={5,5,10,1.0};//光源1位置  glPushMatrix();
 glRotated((GLdouble)spin,1.0, 0.0, 0.0);
 glLightfv(GL_LIGHT0,GL_POSITION,light_position);
 glPopMatrix();
 glLoadIdentity();
 glTranslated(0,0,-3);
 glutSolidSphere(1.0,20,16);
 /*在缓存中绘制4对顶点坐标的矩形*/  glFlush();          //立即显示出来
} void init()
{
 glClearColor(0.0,0.0,0.0,0.0);     //用黑色清除背景
 
 
 GLfloat mat_specular[]={1.0, 1.0, 1.0, 1.0}; //材质镜面反射色
 GLfloat mat_shininess[]={50.0};     //光洁度,即物体反射比率
 GLfloat lmodel_ambient[]={0.2,0.2,......

阅读全文(2534) | 评论:0