HashMap和Hashtable 之源代码详解
Hashtable从JDK1.0就已经有了, 所以让我们先来看看它是怎么工作, 然后有浅入深, 来研究HashMap的原理, 以及两者的不同点.
Hashtable有几个主要的字段, 如下,
/**
* The hash table data.
*/
private transient Entry[] table;
/**
* The total number of entries in the hash table.
*/
private transient int count;
/**
* The table is rehashed when its size exceeds this threshold. (The
* value of this field is (int)(capacity * loadFactor).)
*
* @serial
*/
private int threshold;
其中最重要的就是那个table数组了. 它就是整个hashtable的基本数据结构! 在来看一下这个字段
private transient Entry[] table;
可以看到, hashtable的基本数据结构就是, 一个包涵Entry类的二维数组. 而这个Entry类是hashtable的内在类, 它其实是一个单向链, 让我们详细分析一下.
private static class Entry
int hash;
K key;
V value;
Entry
...
...
看到这里有没有想到学校里教的数据结构原理这门课呢? Entry类就是定义了一个很简单的单向链结构, 它里面包括key, value和下个Entry类的对象next.
在这里我在强调一下, hashtable的数据结构就是一个包涵单向链的二维数组.
接下来让我们来看看hashtable的构造器是长的什么样的.
最长用的
public Hashtable() {
this(11, 0.75f);
}
这个构造器调用了另外一个构造器
public Hashtable(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal Load: "+loadFactor);
if (initialCapacity==0)
initialCapacity = 1;
this.loadFactor = loadFactor;
table = new Entry[initialCapacity];
threshold = (int)(initialCapacity * loadFactor);
}
细读代码后, 我们发现这个构造器构造了table字段和threshold. Table前面已经详细讲了, 那么这个threshold又是什么东东呢?
其实这个threshold对hashtalbe的性能影响是很大的! 因为table是个数组, 如果在hashtable中保存的实体大于一定的数量后, 对数据的读写就会有很慢, 那是因为, 很多数据都保存在entry类的单向链中, 每次读写都要比对链中所有的数据, 链越长读写就越慢.
所以当数据容量大于threshold的时候, hashtable就会做rehash(), rehash把table的容量扩大一倍, 再把从前在table里的数据统统搬回新的table. 这样的一个过程, 开销是多么的大呀.
threshold = (int)(initialCapacity * loadFactor);
Hashtable类提供了构造涵数, 用户可以自定, intitialCapacity和loadFactor. 对于那些大概知道容量的hashtable, 用户应该自定intitialCapacity. 这样的话, 就可以省去一大笔rehash的开销.
现在让我们来看hashtable的put和get操作
public synchronized V get(Object key) {
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
return null;
}
先来看get方法, get可谓是hashtable中的最基本方法了, 它是通过key来拿到hashtable中的value.
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
从key拿到hashCode, 从hashCode再计算出在table中的index, 也就是在数组中的第几个列.
至于为什么要与 0x7FFFFFFF, 那是hashtable 提供的hash算法, hashMap提供了不同的算法, 用户如果要定义自己的算法也是可以的. 如果要知道不同的具体算法, 就google or 百度一下吧.
好了, 现在我们有了index, 就可以到table数组里的entry单向链去找value啦.
for (Entry
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
for语句就是简单的检索entry的单链, if语句检查key是否相同. 这里就遇到了java学习中的一个重大知识点. hasCode()和equal()的关系.
大家都学过如果hasCode()的值相同的话, equal不一定相同, 而如果equal相同的话, hasCode一定要相同. 但那是为什么呢? 其实答案就在上面的代码中!
Hashtable的数据结构是一个包涵单向链的二维数组. 从hasCode我们得到hash和index, 并得以确定这个key在table数组中的第几个列, 然而这显然是不够的, 因为, entry类是一个单向列, 它可以是一个, 也可能是很多个key组成, 那么要从一系列有着相同hasCode的entry中找到, 我们所要的key的话, 就要用equals了. 只有两个key是相等的, 那才是我们要找的. 找到key之后, 只要简单的把value返回就好了. 如果对entry 类还有疑问的话, 请参考前面的解释.
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();
tab = table;
index = (hash & 0x7FFFFFFF) % tab.length;
}
// Creates the new entry.
Entry
tab[index] = new Entry
count++;
return null;
}
接下来再来看看put方法, 理解了get, put就很容易弄明白了.
首先, 要放入hashtable的value不能是null, 否则就报错.
其次, 然后要确保key不能已经在hashtable里面, 有的话, 就返回value.
再次, 检查是否容量已经太大, 如果太大话就rehash, 这会是一个很浪费资源的方法, 请参考前文.
最后, 也是最重要的, 我们要把key-value保存到hashtable中去.
Entry
tab[index] = new Entry
1.拿到当前在table数组中的entry对象.
2.根据传入的key和value建一个新的entry并赋予给当前的table的index中
protected Entry(int hash, K key, V value, Entry
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
这是entry类的构造函数. 简单的说, 就是在单链的最前端加了个新的entry对象.
从这里也可以看出, 对于那些后写入的object, 反而可以以比较快的速度读出, 那是因为后写入的object, 总是在链的前端.
看完了hashtable, 我们在来看看hashMap
hashMap可以算作是hashtable的升级版本, 最早从1.2开始有的.
整体上hashMap对hashtable类优化了代码. 比如说, 消除了hardcoding, 增加了code reuse等等.
但是, 两者之间最主要的不同有两点.
1.hashMap的读写是unsynchronized, 在多线程的环境中要注意使用
而hashtable是synchronized
这两者的不同是通过在读写方法上加synchronized关键字来实现的.
hashMap
public V put(K key, V value)
public V get(Object key)
hashtable
public synchronized V get(Object key)
public synchronized V put(K key, V value)
可能有人问, 能synchronized, 能线程安全好啊. 为什么不要呢?
这里其实还是一个效率的问题. 对于线程安全的方法, 系统要进行加锁, 减锁操作. 性能会有很大的影响. 由于很多程序是在单线程或者说是线程安全的情况下工作的, 所以用synchronized就显得多余了.
3.第二个不同是hashMap可以放空值, 而hashtable就会报错.
hashMap
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
hashtable
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
室内设计经典布光思路及灯光讲解 有个著名而经典的布光理论就是“三点照明”。笔者在此简述一 下:三点照明,又称为区域照明,一般用于较小范围的场景照明。如果场景很大,可以把它拆分成若干个较小的区域进行布光。一般有三盏灯即可,分别为主体光、辅助光与背景光。 主体光:通常用它来照亮场景中的主要对象与其周围区域,并且担任给主体对象投影的功能。主要的明暗关系由主体光决定,包括投影的方向。主体光的任务根据需要也可以用几盏灯光来共同完成。如:主光灯在1 5度到30度的位置上,称顺光;在45度到90度的位置上, 称为侧光;在90度到120度的位置上成为侧逆光。主体光常用聚光灯来完成。笔者喜欢把主体光的亮度设置为240左右。辅助光: 又称为补光。用一个聚光灯照射扇形反射面,以形成一种均匀的、非直射性的柔和光源,用它来填充阴影区以及被主体光遗漏的场景区域、调和明暗区域之间的反差,同时能形成景深与层次,而且这种广泛均匀布光的特性使它为场景打一层底色,定义了场景的基调。由于要达到柔和照明的效果,通常辅助光的亮度只有主体光的 5 0%-80% 背景光:它的作用是增加背景的亮度,从而衬托主体,并使主体对象与背景相分离。一般使用泛光灯,亮度宜暗不可太亮。 布光的顺序是:1)先定主体光的位置与强度;2)决定辅助光的强度与角度;3)分配背景光与装饰光。这样产生的布光效果应该能达到主次分明,互相补充。布光还有几个地方需要特别注意:1)灯光宜精不宜多。过多的灯光使工作过程变得杂乱无章,难以处理,显
示与渲染速度也会受到严重影响。只有必要的灯光才能保留。另外要注意 灯光投影与阴影贴图及材质贴图的用处,能用贴图替代灯光的地方最好用贴图去做。例如要表现晚上从室外观看到的窗户内灯火通明的效果,用自发光贴图去做会方便得多,效果也很好,而不不要用灯光去模拟。切忌随手布光,否则成功率将非常低。对于可有可无的灯光,要坚决不予保留。 2)灯光要体现场景的明暗分布,要有层 次性,切不可把所有灯光一概处理。根据需要选用不同种类的灯光,如选用聚光灯还是泛光灯;根据需要决定灯光是否投影,以及阴影的浓度;根据需要决定灯光的亮度与对比度。如果要达到更真实的效果,一定要在灯光衰减方面下一番功夫。可以利用暂时关闭某些灯光的方法排除干扰对其他的灯光进行更好地设置。 3)要知道max中的灯光是可以超现实的。要学会利用灯光的“排除” 与“包括”功能,绝对灯光对某个物体是否起到照明或投影作用。例如要模拟烛光的照明与投影效果,我们通常在蜡烛灯芯位置放置一盏泛光灯。如果这盏灯不对蜡烛主体进行投影排除,那么蜡烛主体产生在桌面上的很大一片阴影可能要让我们头痛半天。在建筑效果图中,也往往会通过“排除”的方法使灯光不对某些物体产生照明或投影效果。 4)布光时应该遵循由主体到局部、由简到繁的过程。对于灯光效果的形成,应该先调角度定下主格调,再调节灯光的衰减等特性来增强现实感。 最后再调整灯光的颜色做细致修改。 灯光的分类及其属性 在3DMA中,灯光分为标准灯光与光度学灯光,还有制作室内效果图
20个代码生成框架 11.1 CodeSmith http: 官方论坛: http: 版权形式:30天试用 开源:否需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith 简单、好用。 所有api可以在帮助菜单中找到。 http: 官方论坛: 版权形式: 免费 开源:否 1.3 NHibernate. http: 官方论坛: 版权形式:
免费 开源:否 1.4湛蓝.Net代码生成器 http: 官方论坛: http: 版权形式: 免费 开源:否 1.5动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 http: 官方论坛: 版权形式: 免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大http: 官方论坛:
版权形式: 需要少量的注册费用 开源:否下载地址很神秘 1.7 CodeMaker http: 官方论坛: 版权形式: 免费 开源:否 https://www.wendangku.net/doc/fd5022561.html,代码生成器 可以使用本工具生成https://www.wendangku.net/doc/fd5022561.html,和C#语言的代码,以及三层架构与ORM架构代码,并且使用的ORM持久化组件是开源的,您可以在本软件的安装目录下找到它 官方论坛: 版权形式: 免费 开源:否 1.9 BMW业务模型及代码生成器 一款人气很旺的免费C#代码生成器
官方论坛: 版权形式: 免费 开源:否 1.10飞鹰CoolCoder 专门为采用nhibernate做关系对象影射架构的系统提供代码的工具,简单易用,虽然不提供源码,我们可以用反编译工具对其反编译看源码。这是个很不错的学习机会。 官方论坛: 版权形式: 免费 开源:否 1.11 AutoCoder自动代码生成器 AutoCoder自动代码生成器是一个根据模板自动生成代码的代码生成工具,根据模板的不同,可以生成任何语言(如: ASP、C#、C++BUILDER、DELPHI、JAV A、JSP、PHP、V B、https://www.wendangku.net/doc/fd5022561.html,……),不同层次结构(B/S、C/S、n-tiger……),基于不同数据库(ORACL E、MSSQL、MYSQL、
word域代码详解 十个特殊指令(域开关),分别是: 1.数组\A、 2.括号\B、 3. 位移\D、 4.分式\F、 5.积分\I、 6.列表\L、 7.重叠\O、 8.根号\R、 9.上下标\S、 10.框\X, 每个开关又有若干个选项,用以精确调节格式。 1. 数组开关\A(): 按行顺序将数组元素排列为多列 域代码:{EQ \a(100,2,31) } 讲解:{EQ\列表(100,2,31排成一列)} 可用参数:\al左对齐;\ac居中;\ar右对齐;\con元素排成n 列;\vsn行间增加n 磅;\hsn列间增加n磅 \al左对齐 域代码:{EQ \a\al(100,2,31)} 讲解:{EQ \列表\左对齐(100,2,31)} \ac居中 域代码:{EQ \a\ac(100,2,31) } 讲解:{EQ \列表\居中对齐(100,2,31)} \ar右对齐 域代码:{EQ \a\ar(100,2,31) } 讲解:{EQ \列表\右对齐(100,2,31)} \con元素排成n列 域代码:{EQ \a\co3(10,2,31,0,1,0,14,3,55)} 讲解:{EQ \列表\元素排成3 列(10,2,31,0,1,0,14,3,55)} \vsn 行间增加n磅 域代码:{EQ \a\co3\vs2(10,2,31,0,1,0,14,3,55)} 讲解:{EQ \列表\元素排成3列\行间增加2磅} \hsn 列间增加n磅 域代码:{EQ \a\co3\vs2\hs4(10,2,31,0,1,0,14,3,55)} 讲解:{EQ \列表\元素排成3列\行间增加2磅\列间增加4磅} 2. 括号开关\B(): 用大小适当的括号括住元素。 域代码:{EQ \b( \a(100,2,31)) } 讲解:{EQ \加括号( \数组(100,2,31))} 可用参数:左括号使用字符* \lc\*;右括号使用字符* \rc\* ;左右括号都使用字符* \bc\* \lc\* 左括号使用字符* 域代码:{EQ \b\lc\|( \a(100,2,31))} 讲解:{EQ \加括号\左括号使用字符|( \数组(100,2,31)) } \rc\* 右括号使用字符* 域代码:{EQ \b\rc\|( \a(100,2,31)) } 讲解:{EQ \加括号\右括号使用字符|( \数组(100,2,31))} \bc\* 左右括号都使用字符*
计算机图形学期末作业 作业题目:Ray Tracing算法的实现 姓名:李海广 学号:S130201036 任课教师:秦红星
摘要 Ray Tracing算法又叫光线跟踪算法,它能通过递归方法逐个计算每个像素点的光强,然后就可以绘制出高度真实感的图像,因此该方法在图形学领域得到了广泛的应用。Ray Tracing算法的思想还能应用到移动通信终端定位领域,该领域里的射线跟踪法与此算法思想类似。MFC是微软公司提供的一个类库,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC在处理Windows窗口应用程序方面具有很大的优势,因此,本文使用MFC在VC6.0里实现Ray Tracing算法,并给出了该算法的详细讲解。 【关键词】Ray tracing 光线跟踪递归像素光强 MFC C++
目录 1.Ray Tracing算法概述 (1) 1.1Ray Tracing算法简介 (1) 1.2Ray Tracing算法的实现原理 (1) 2.Ray Tracing算法的具体实现 (2) 2.1算法的实现环境 (2) 2.2实现算法的C++程序简介 (2) 2.3算法的具体实现过程 (3) 2.4 程序运行结果 (11) 3.总结 (11) 3.1 通过该算法学到的东西 (11) 3.2本程序未完成的任务 (12) 4.参考文献 (12)
1.Ray Tracing算法概述 1.1Ray Tracing算法简介 光线跟踪(Ray tracing),又称为光迹追踪或光线追迹,它是来自于几何光学的一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。它用于光学系统设计,如照相机镜头、显微镜、望远镜以及双目镜等。这个术语也用于表示三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术将具有一定数学模型的场景显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以在追求高质量结果时我们经常使用这种方法。 在光线跟踪的过程中,我们要考虑许多因素。要跟踪的光线包括反射光线、散射光线和镜面反射光线,利用递归方法并且设定一定的阀值来跟踪;在计算光强度时,我们要考虑场景中物体的反射系数、漫反射系数和镜面反射系数,还有交点处的法向量,出射光线的方向向量;在求视线以及反射光线和场景中物体的交点时,要计算出离眼睛以及出射点最近的交点作为击中点,得到击中点之后,我们就可以计算出击中点的坐标。最终,通过三个公式计算出每一个像素点处三种光线的光强值,再将三个光强值相加,就得到了该像素点出的总光强值,最后将颜色缓冲器中的三种颜色值输出到屏幕上,就得到了我们需要的光线跟踪图像。 1.2Ray Tracing算法的实现原理 (1)对图像中的每一个像素,创建从视点射向该像素的光线; (2)初始化最近时间T为一个很大的值,离视点最近的物体指针设为空值; (3)对场景中的每一个物体,如果从视点出发的光线和物体相交,且交点处的时间t比最近时间T小,则将t的值赋给最近时间T,并设置该物体为最近物体,将物体指针指向该物体; (4)经过第三步的计算后,如果最近物体指针指向空值NULL,则用背景色填充该像素。如果该指针指向光源,则用光源的颜色填充该像素;
用域代码处理Word页码 一、插入基本页码 例如某份文档,当前设置为每页两栏,现在的要求是在每一栏的下面都插入相应的页码,也就是将原来的第一页设置为1、2页,第二页设置为3、4页,以此类推。简单分析一下,其实左侧栏的页码数可以由公式“当前页码×2-1”后得到,右侧栏的页码数可以由公式“当前页码×2”得到,这里以Word 2007为例进行说明,具体操作步骤如下: 第1步:切换到“页码布局”标签页,执行“分栏→两栏”命令,将当前文档拆分为两栏,至于其他的要求可以暂时取默认设置,效果如图1所示。 图1 Word 2007执行分栏(点击看大图) 第2步:切换到“插入”标签页,在“页脚”下拉菜单中选择“空白”,接下来请在需要添加页码的位置处分别画出两个文本框,右侧栏的文本框可以通过复制获得,见图2。 图2 Word 2007画出文本框(点击看大图 二、插入域代码 第3步:将光标定位在文本框中,注意此时请仍旧切换到“插入”标签页,在“文档部件”下拉菜单中选择“域”,此时会弹出图3所示的对话框,在“类别”下拉列表框中选择“等式和
公式”,在“域名”列表框中选择“= (Formula)”,记得请去除右下角的“更新时保留原格式”复选框。 图3 Word 2007插入域(点击看大图) 单击“确定”按钮,此时文本框中的文字会变为“!异常的公式结尾”,其实这并非错误,只是一行域代码而已,按下“Alt+F9”组合键后会正常显示“{ = }”原形;将光标定位在“=”的后面,继续插入“编号”中的“Page”域,注意请仍旧去除“更新时保留原格式”的复选框,插入后域代码变为“{ ={ PAGE } }”。 第4步:现在,我们应该根据事先的分析,将这个已插入的域更改为“{ ={ PAGE }*2-1 }”,接下来再按照同样的方法,将右侧栏的域代码更改为“{ ={ PAGE }*2 }”(见图4)。 图4 Word 2007修改已插入域(点击看大图) 完成上面的工作后,我们就可以按下“Alt+F9”组合键进行查看,注意请将两个文本框的“线条”的颜色设置为“无颜色”,如图5所示,效果不错吧?如果有需要的话,你可以在页码的前后分别输入“第”和“页”,如果是一页分成了三栏,那么它的域代码应该分别设置为
三维图像渲染基本概要 渲染(Render)是用软件从模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。图像是数字图像或者位图图像。渲染这个术语类似于“艺术家对于场景的渲染”。另外渲染也用于描述计算视频编辑文件中的效果以生成最终视频输出的过程。 渲染是三维计算机图形学中的最重要的研究课题之一,并且在实践领域它与其它技术密切相关。在图形流水线中渲染是最后一项重要步骤,通过它得到模型与动画最终显示效果。自从二十世纪七十年代以来随着计算机图形的不断复杂化,渲染也越来越成为一项重要的技术。 渲染的应用领域有:计算机与视频游戏、模拟、电影或者电视特效以及可视化设计,每一种应用都是特性与技术的综合考虑。作为产品来看,现在已经有各种不同的渲染工具产品,有些集成到更大的建模或者动画包中,有些是独立产品,有些是开放源代码的产品。从内部来看,渲染工具是都是根据各种学科理论经过仔细设计的程序,其中有:光学、视觉感知、数学以及软件开发。 三维计算机图形的预渲染或者实时渲染的速度都非常慢。预渲染的计算强度很大,通常是用于电影制作;实时渲染经常用于三维视频游戏,通常依靠带有三维硬件加速器的图形卡完成这个过程。 使用在图像初步建立(通常使用网格骨架构建)之后,就要进行
渲染了。渲染将会在上面添加位图纹理或者程序纹理、照明、凸凹纹理映射以及相对于其它物体的位置。得到的结果就是消费者或者观察者所能看到的完整图像。 对于电影动画来说,需要渲染几幅或几帧图像,并且将这些图像在动画制作程序中将它们连结在一起。大多数的三维图像编辑程序都能够完成这项工作。 特性 渲染的图像有许多显著的特性,渲染研究的领域也主要集中在寻找高效模拟这些特性的方法。有些特性只与特定的算法有关,有些却与多个算法相关。 ●浓淡处理 — 表面颜色与亮度随光照的变化 ●纹理映射 — 在表面生成细节的方法 ●凸凹纹理映射 — 在表面模拟小凸凹的方法 ●距离模糊 — 光照穿过不清澈的大气时的模糊 ●阴影 — 阻挡光照的效果 ●柔和阴影 — 非常微弱的光源生成的暗处 ●反射 — 镜子或者非常光滑的反射 ●透明 — 固体明显允许光线穿过 ●半透明 — 光线通过固体高度散射 ●折射 — 与透明相关的光线弯曲
1.什么是域 简单地讲,域就是引导Word在文档中自动插入文字、图形、页码或其他信息的一组代码。每个域都有一个唯一的名字,它具有的功能与Excel中的函数非常相似。下面以Seq和Date域为例,说明有关域的一些基本概念。 形如“{Seq Identifier [Bookmark ] [Switches ]}”的关系式,在Word中称为“域代码”。它是由: 域特征字符:即包含域代码的大括号“{}”,不过它不能使用键盘直接输入,而是按下Ctrl+F9组合键输入的域特征字符。 域名称:上式中的“Seq”即被称为“Seq域”,Word 2003提供了9大类共74种域。 域指令和开关:设定域工作的指令或开关。例如上式中的“Identifier”和“Bookmark”,前者是为要编号的一系列项目指定的名称,后者可以加入书签来引用文档中其他位置的项目。“Switches”称为可选的开关,域通常有一个或多个可选的开关,开关与开关之间使用空格进行分隔。 域结果:即是域的显示结果,类似于Excel函数运算以后得到的值。例如在文档中输入域代码“{Date \@ "yyyy年m月d日" \* MergeFFormat}”的域结果是当前系统日期。 域可以在无须人工干预的条件下自动完成任务,例如编排文档页码并统计总页数;按不同格式插入日期和时间并更新;通过链接与引用在活动文档中插入其他文档;自动编制目录、关键词索引、图表目录;实现邮件的自动合并与打印;创建标准格式分数、为汉字加注拼音等等。 2.在文档中插入域 (1)使用命令插入域 在Word中,高级的复杂域功能很难用手工控制,如“自动编号”和“邮件合并”、“题注”、“交叉引用”、“索引和目录”等。为了方便用户,9大类共74种域大都以命令的方式提供。 在“插入”菜单中提供有“域”命令,它适合一般用户使用,Word提供的域都可以使用这种方法插入。你只需将光标放置到准备插入域的位置,单击“插入→域”菜单命令,即可打开“域”对话框。 首先在“类别”下拉列表中选择希望插入的域的类别,如“编号”、“等式和公式”等。选中需要的域所在的类别以后,“域名”列表框会显示该类中的所有域的名称,选中欲插入的域名(例如“AutoNum”),则“说明”框中就会显示“插入自动编号”,由此可以得知这个域的功能。对AutoNum域来说,你只要在“格式”列表中选中你需要的格式,单击“确定”按钮就可以把特定格式的自动编号插入页面。如图1所示。 你也可以选中已经输入的域代码,单击鼠标右键,然后选择“更新域”、“编辑域”或“切换域代码”命令,对域进行操作。 (2)使用键盘插入 如果你对域代码比较熟悉,或者需要引用他人设计的域代码,使用键盘直接输入会更加快捷。其操作方法是:把光标放置到需要插入域的位置,按下Ctrl+F9组合键插入域特征字符“{ }”。接着将光标移动到域特征代码中间,按从左向右的顺序输入域类型、域指令、开关等。结束后按键盘上的F9键更新域,或者按下Shift+F9组合键显示域结果。
室内设计经典布光思路及灯光讲解有个著名而经典的布光理论就是“三点照明”。笔者在此简述一下: 三点照明,又称为区域照明,一般用于较小范围的场景照明。如果场景很大,可以把它拆分成若干个较小的区域进行布光。一般有三盏灯即可,分别为主体光、辅助光与背景光。 主体光:通常用它来照亮场景中的主要对象与其周围区域,并且担任给主体对象投影的功能。主要的明暗关系由主体光决定,包括投影的方向。主体光的任务根据需要也可以用几盏灯光来共同完成。如:主 光灯在1 5度到30度的位置上,称顺光;在45度到90度的位置上,称为侧光;在90度到120度的位置上成为侧逆光。主体光常用聚光 灯来完成。笔者喜欢把主体光的亮度设置为240左右。辅助光:又称为补光。用一个聚光灯照射扇形反射面,以形成一种均匀的、非直射性的柔和光源,用它来填充阴影区以及被主体光遗漏的场景区域、调和明暗区域之间的反差,同时能形成景深与层次,而且这种广泛均匀布光的特性使它为场景打一层底色,定义了场景的基调。由于要达到柔和照明的效果,通常辅助光的亮度只有主体光的5 0%-80%。 背景光:它的作用是增加背景的亮度,从而衬托主体,并使主体对象与背景相分离。一般使用泛光灯,亮度宜暗不可太亮。 布光的顺序是:1)先定主体光的位置与强度;2)决定辅助光的强度与角度;3)分配背景光与装饰光。这样产生的布光效果应该能达到 主次分明,互相补充。布光还有几个地方需要特别注意:1)灯光宜精不宜多。过多的灯光使工作过程变得杂乱无章,难以处理,
显示与渲染速度也会受到严重影响。只有必要的灯光才能保留。另外要注意灯光投影与阴影贴图及材质贴图的用处,能用贴图替代灯光的地方最好用贴图去做。例如要表现晚上从室外观看到的窗户内灯火通明的效果,用自发光贴图去做会方便得多,效果也很好,而不不要用灯光去模拟。切忌随手布光,否则成功率将非常低。对于可有可无的灯光,要坚决不予保留。 2)灯光要体现场景的明暗分布,要有层次性,切不可把所有灯光一概处理。根据需要选用不同种类的灯光,如选用聚光灯还是泛光灯;根据需要决定灯光是否投影,以及阴影的浓度;根据需要决定灯光的亮度与对比度。如果要达到更真实的效果,一定要在灯光衰减方面下一番功夫。可以利用暂时关闭某些灯光的方法排除干扰对其他的灯光进行更好地设置。 3)要知道max中的灯光是可以超现实的。要学会利用灯光的“排除”与“包括”功能,绝对灯光对某个物体是否起到照明或投影作用。例如要模拟烛光的照明与投影效果,我们通常在蜡烛灯芯位置放置一盏泛光灯。如果这盏灯不对蜡烛主体进行投影排除,那么蜡烛主体产生在桌面上的很大一片阴影可能要让我们头痛半天。在建筑效果图中,也往往会通过“排除”的方法使灯光不对某些物体产生照明或投影 效果。 4)布光时应该遵循由主体到局部、由简到繁的过程。对于灯光效果的形成,应该先调角度定下主格调,再调节灯光的衰减等特性来增强现实感。最后再调整灯光的颜色做细致修改。 灯光的分类及其属性
20个代码生成框架 1 1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://https://www.wendangku.net/doc/fd5022561.html, 官方论坛:http://https://www.wendangku.net/doc/fd5022561.html,/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。 所有api可以在帮助菜单中找到。 官方网站:http://https://www.wendangku.net/doc/fd5022561.html,/portal/default.aspx 官方论坛: 版权形式:免费 开源:否 1.3 NHibernate. NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具. 官方网站:http://https://www.wendangku.net/doc/fd5022561.html,/ 官方论坛: 版权形式:免费 开源:否 1.4 湛蓝.Net代码生成器
一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器 官方网站:http://https://www.wendangku.net/doc/fd5022561.html, 官方论坛:http://https://www.wendangku.net/doc/fd5022561.html,/ 版权形式:免费 开源:否 1.5 动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 官方网站:http://https://www.wendangku.net/doc/fd5022561.html, 官方论坛: 版权形式:免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大 官方网站:http://https://www.wendangku.net/doc/fd5022561.html, 官方论坛: 版权形式:需要少量的注册费用 开源:否 下载地址很神秘 1.7 CodeMaker asp,jsp,php代码生成工具,自动生成维护数据库信息的动态网页的代码生成器。它可以帮助ASP、JSP、PHP开发人员快速的开发简单的数据库维护程序。无需任何编码,只需将数据库结构导入到CodeMaker中并做简单的设置,CodeMaker即可生成完整的数据库操作页面。用CodeMaker可以简单快速的创建网站后台维护程序。提高开发效率数十倍以
一、插入基本页码 例如某份文档,当前设置为每页两栏,现在的要求是在每一栏的下面都插入相应的页码,也就是将原来的第一页设置为1、2页,第二页设置为3、4页,以此类推。简单分析一下,其实左侧栏的页码数可以由公式“当前页码×2-1”后得到,右侧栏的页码数可以由公式“当前页码×2”得到,这里以Word 2007为例进行说明,具体操作步骤如下: 第1步:切换到“页码布局”标签页,执行“分栏→两栏”命令,将当前文档拆分为两栏,至于其他的要求可以暂时取默认设置,效果如图1所示。 图1 Word 2007执行分栏 第2步:切换到“插入”标签页,在“页脚”下拉菜单中选择“空白”,接下来请在需要添加页码的位置处分别画出两个文本框,右侧栏的文本框可以通过复制获得,见图2。
图2 Word 2007画出文本框 二、插入域代码 第3步:将光标定位在文本框中,注意此时请仍旧切换到“插入”标签页,在“文档部件”下拉菜单中选择“域”,此时会弹出图3所示的对话框,在“类别”下拉列表框中选择“等式和公式”,在“域名”列表框中选择“= (Formula)”,记得去除右下角的“更新时保留原格式”复选框。
图3 Word 2007插入域 单击“确定”按钮,此时文本框中的文字会变为“!异常的公式结尾”,其实这并非错误,只是一行域代码而已,按下“Alt+F9”组合键后会正常显示“{ = }”原形;将光标定位在“=”的后面,继续插入“编号”中的“Page”域,注意请仍旧去除“更新时保留原格式”的复选框,插入后域代码变为“{ ={ PAGE } }”。 第4步:现在,我们应该根据事先的分析,将这个已插入的域更改为“{ ={ PAGE }*2-1 }”,接下来再按照同样的方法,将右侧栏的域代码更改为“{ ={ PAGE }*2 }”(见图4)。 图4 Word 2007修改已插入域 完成上面的工作后,我们就可以按下“Alt+F9”组合键进行查看,注意请将两个文本框的“线条”的颜色设置为“无颜色”,如图5所示,效果不错吧?如果有需要的话,你可以在页码的前后分别输入“第”和“页”,如果是一页分成了三栏,那么它的
域应用基础 1.什么是域 简单地讲,域就是引导Word在文档中自动插入文字、图形、页码或其他信息的一组代码。每个域都有一个唯一的名字,它具有的功能与Excel中的函数非常相似。下面以Seq和Date域为例,说明有关域的一些基本概念。 形如“{Seq Identifier [Bookmark ] [Switches ]}”的关系式,在Word中称为“域代码”。它是由: 域特征字符:即包含域代码的大括号“{}”,不过它不能使用键盘直接输入,而是按下Ctrl+F9组合键输入的域特征字符。 域名称:上式中的“Seq”即被称为“Seq域”,Word 2003提供了9大类共74种域。 域指令和开关:设定域工作的指令或开关。例如上式中的“Identifier”和“Bookmark”,前者是为要编号的一系列项目指定的名称,后者可以加入书签来引用文档中其他位置的项目。“Switches”称为可选的开关,域通常有一个或多个可选的开关,开关与开关之间使用空格进行分隔。 域结果:即是域的显示结果,类似于Excel函数运算以后得到的值。例如在文档中输入域代码“{Date \@ "yyyy年m月d日" \* MergeFForma t}”的域结果是当前系统日期。 域可以在无须人工干预的条件下自动完成任务,例如编排文档页码并统计总页数;按不同格式插入日期和时间并更新;通过链接与引用在活动文档中插入其他文档;自动编制目录、关键词索引、图表目录;实现邮件的自动合并与打印;创建标准格式分数、为汉字加注拼音等等。 2.在文档中插入域 (1)使用命令插入域 在Word中,高级的复杂域功能很难用手工控制,如“自动编号”和“邮件合并”、“题注”、“交叉引用”、“索引和目录”等。为了方便用户,9大类共74种域大都以命令的方式提供。 在“插入”菜单中提供有“域”命令,它适合一般用户使用,Word提供的域都可以使用这种方法插入。你只需将光标放置到准备插入域的位置,单击“插入→域”菜单命令,即可打开“域”对话框。 首先在“类别”下拉列表中选择希望插入的域的类别,如“编号”、“等式和公式”等。选中需要的域所在的类别以后,“域名”列表框会显示该类中的所有域的名称,选中欲插入的域名(例如“AutoNum”),则“说明”框中就会显示“插入自动编号”,由此可以得知这个域的功能。对AutoNum域来说,你只要在“格式”列表中选中你需要的格式,单击“确定”按钮就可以把特定格式的自动编号插入页面。如图1所示。 你也可以选中已经输入的域代码,单击鼠标右键,然后选择“更新域”、“编辑域”或“切换域代码”命令,对域进行操作。 (2)使用键盘插入 如果你对域代码比较熟悉,或者需要引用他人设计的域代码,使用键盘直接输入会更加快捷。其操作方法是:把光标放置到需要插入域的位置,按下Ctrl+F9组合键插入域特征字符“{ }”。接着将光标移动到域特征代码中间,按从左向右的顺序输入域类型、域指令、开关等。结束后按键盘上的F9键更新域,或者按下Shift+F9组合键显示域结果。
向你介绍电影级第一渲染器——renderman综合教程3 二、Renderman进阶 在学会了Prman的一些渲染流程后,我们将测试一下Renderman的一些高级工具:Displacement、Volume、Multi-segment Motion Blur和使用自己写的Shader。 Renderman除了上面的SoftShadow外,还有几样杀手锏——Displacement、MotionSample、RiCurve等强劲效果。其中Displacement是众多渲染器中最好效果的、最真实的。 Renderman的Displacement有两种方式——Do Displacement和Bump。Do Displacement是真实的贴图置换,效果惊人,而Bump只是简单地改变法线的方向,效果还算可以。
一般渲染真实的Volume需要光线跟踪,而Renderman的Volume效果就不用光线跟踪都可以渲染出漂亮的体积光。
Motion blur是运动模糊,它可以表现十分有动感的运动效果。一般的Motion blur都是简单的帧与帧之间的运动插值,欠缺真实感。而分布式光线跟踪虽然可以做出漂亮的效果但计算时间又太长。RAT套件里的Motio nSample就可以在