-
企业建站所需
2008-01-10 19:56:21
建站之前应该做些什么?
建立一个成功的网站,并非一朝一昔可以做到。
不少新近参与互联网业务的服务商在建立网站的过程中,缺乏周密的计划,使之在经营中受到挫折;甚至有不少光竿司令,什么都想做,服务却跟不上,好不容易培养起来的客户群,被糟糕的服务给吓跑了...
那么,如何建立网站,才是成功的第一步呢?
市场调查阶段
了解一下目前internet的发展状况以及同类站点的发展、经营状况,吸取他们的长处,找出自己的优势,对市场作个调查,明确自己网站的主题,寻找一个好的出发点。
你设想中的网站规模有多大?
做网站并不是盲目的想做多大就作多大,而要根据自身的现阶段能力,以及企业的规模大小,确定你的网站是小型、中型、大规模的网站,还是从小规模的开始,然后逐步发展。这主要的是关系到网站的后期维护以及网站的发展方向来考虑的。
确定网站的类别,你希望网站有怎样的设计特色?
根据主题、形式以及本身企业的特点,网站的设计也有不同的类别,大概可分为:
第一种:以内容为主,设计为辅,注重速度这种大型的门户网站,它一般体现在专业的icp,isp供应商制作的网站,在设计这类网站时不要太花哨,应注重信息量和简洁清晰的视觉形象;
第二种:大多数企业为了更好的宣传自己的产品,扩大销路,使自己的产品走向世界,提高自己企业的形象而制作的网站,这种网站制作应结合本身产品特点而制作的特色网站,相对来说比较注重产品的营销;
第三种:是政务类的网站,一般这种网站相对体现在政府部门,作为对外一个窗口,相对来说这种网站设计比较严肃、权威;
第四种:个人主页网站,这种网站相对比较自由,不受什么约束,可以根据每个人自己的特长自由发挥。
因此我们在制作主页时先明确自己的定位方向,设计出适合自己的站点。
你的主要目标受众是谁?
根据网站的类别不同,目标受众也不一样,如工商业者、专业人士、学生;女性,男性;儿童,青少年,中年人,老人;比如教育类的网站相对来说是目标受众是院校的老师和学生。化妆类、护肤产品类的网站相对来说是女性等。
确定网站的整体风格
其实,这个原则和传统的印刷出版物没什么区别。你网页上所有的图像、文字,包括像背景颜色、区分线、字体、标题、注脚什么的,都要在统一风格中寻求变化,贯穿全站。这样子读者看起来舒服、顺畅,会对你的网站留下很专业的印象。
举个简单例子。如果你在列示一二三四若干条的情况下,在每条前面用黑圆点加强视觉效果,那么其他类似地方,也应该用保持同样的风格。色彩斑斓的站点,尤其要注意风格的统一。颜色可以变,不过字体、主体文本对齐风格、标题、背景效果以及特殊图像效果等等都应保持统一。
很多缺乏编辑、出版背景的网友,很容易忽视这点,特别是网页一多,更容易忘。
根据目标框架整理出站点的内容框架以及逻辑结构图
①把目标细化以整理出站点内容框架
基本确定的目标,您就应该把目标细化,并初步整理出为达到这些目的,站点所需要包含的所有内容了。例如,站点应该发布什么信息,站点需要提供什么应用程序,等等。然后,你应该把初步定下的内容纲要写下来,交给上级或业务人员审核批准。这实际上就形成了站点设计的需求报告。在你的内容纲要里,还应该注明这些内容的信息来源,哪个部门应该提供哪方面的信息。把这些罗列下来,会使得上级以及各个相关部门清楚"谁应该为这些内容负责"。
②进一步整理出站点逻辑结构图
定下内容纲要后,你应该能够大致画出站点的结构图了。画出结构图的目的,主要是便于有逻辑地组织站点和链接,同时,将来你会用这个图去分配工作和任务。
例如:
你可以告诉某个开发人员,让他完成结构图中某个分支的内容;
你可以把这个图递交给业务人员,告诉他们哪些页面,需要他们进一步提供内容或资料;
你可以把结构图给我们的设计人员看,让设计师考虑以什么样的形式来表现你要表达的内容等等。QQ405928356
-
当爱情悄然走过,我才懂得
2007-04-23 08:52:43
但是,现实有时侯是残酷的。这样的感情注定是没有相交的两条曲线,只能是一种凌驾于爱情与友情之间的另类情感。当爱走到这一步的时候,曾经所有的幻想都会变成一种相思的苦难,爱在理智与现实之间不停的争斗。每一天的日子都会是一种艰难的取舍。
我试着去忘掉她,让她不再去承受这份沉重的感情折磨,也还给自己一片自由的空间。她面对着大海,想问大海要到答案,但是我们仍然逃脱不了残酷现实的折磨。
终于,当两个人都精疲力尽的时候,最后的选择到了。
静静的调整好彼此的心情,小心的问对方,做不了爱人我们做什么?
“我们做知己吧”!她对他说。他说:“不,我承受不了那份永久的牵挂与思念,没有人能做好一辈子的知己。”
“那我们做情人吧”!她对他说。他说:“不,因为你是善良的女人,尽管我们的感情没有阳光的青睐,但是这样暧昧的词语是对我们的玷污”。
“那我们做兄妹吧”!她对他说。他说:“不,我们的爱早已越过了兄妹之间的亲情,会有哥哥用带着柔情爱意的目光看待妹妹的吗?我不会做这样的哥哥”。
“那我们做朋友吧,我只能给你这个了”她对他说。他说:“不,在我的心里你早已经是我的爱人了,做了朋友的身份,我无法面对你和你将来的另一半,也无法想像你和你另一半在一起的时候……我也无法抗拒和我的另一半同床共眠的时候不去想你。
“唉,我们还是做仇人吧”!他对她说。既然我们都改变不了自己的命运,此生注定了没有相互厮守一生的幸福,与其这样相互的念着、痛着,仇恨的远离对方的视线,永远的找寻不到对方,也许会是一种最好的解脱。
她愕然了,我哭了。无法想像最后能给与对方的竟然是这样的结局。但是他们明白,也只有这样选择,才可以保留住对方的那份善良与纯洁,也不再会去伤害更多的人。
从此,我们消失了,没有相互的祝福,就这样静静的消失在茫茫的人海中。
两副柔弱的肩膀,承受不住这样的爱情。
爱就这样不堪承受生命之重。 -
[论坛] 做不了爱人,我们做什么?
2007-04-23 08:32:46
人活这一辈子,会相遇许许多多的人,有现实中的,也有非现实中的。但是往往也只有那么几个特别的人,会让你终生的难以忘却。在这仅仅的几个人之中,他(她)也许是你的爱人、你的知己、你的最铁的朋友……而最难以释怀的大概也就是曾经令你最心痛而又使你魂牵梦绕的那个人吧。
这个人可能是你无意之间偶遇的,也可能是你高中的同学,在你没有刻意准备的时候,也许因为一个很特别的名字、一盘走的非常出色的棋、打一场很出色的比赛。同班同学的她……从此QQ里有了对方的名字,聊天纪录的页数也在飞快的增长。再后来有了彼此的电话、再后来……
我和她就是这样简单的相遇在了一起。我品味到了她的善良与聪慧,她欣赏到我的优秀与坚韧。
现在,她已经是可以倾听我故事的那个人了。在我悲伤难过的时候她会用温热的双手轻轻的托起我泪眼婆娑的脸庞告诉我男人应该坚强、在我遭遇挫折将要崩溃的时候用心将我拥入怀中告诉我生活还会有美好的一面。当我像孩子一样欢快蹦跳的时候,她会陪着我一起的开心。当然,她也需要我结实的肩膀、宽阔的大手。她更想听到来自我絮叨的叮咛、温暖的安慰、时时刻刻的牵挂。哪怕相距是多么的遥远,哪怕说出来的只是没有实际意义的语言,这都不重要。也就到了这个时候,这一切早已经变成一种心灵上的默契,不需要多说一个字眼。我们会在同一时间看着午夜的星空,看着那皎洁的月亮而想到对方,想起对方带给自己的快乐、想起对方的真诚与执著、想起坐在摇椅上一起慢慢变老的幸福……
但是,现实有时侯是残酷的。 -
浪漫的事
2007-04-22 14:19:04
第一部分:第1-10件事情
1、布置一间书房,要一整面墙的大书柜,和你一起慢慢把它装满;
2、和你背靠背、一边听我们都喜欢的CD,一边看各自的书,坐在木地板上;
3、洗澡的时候,帮你刮胡子;
4、你吃饭吃的香的时候,放下筷子看你一会儿;
5、和你一起去西藏;
6、和你一起去一趟北欧;
7、偷偷用你的牙刷刷牙;
8、当你下班回来说累极了,说饿得站不稳了的时候,抱抱你,然后做一桌子好吃的给你;
9、和你一起照看我们的父母;
10、天天陪你看星星。
第二部分:第11-20件事情
11、不为什么地亲亲你;
12、让你做我所有作品的第一读者;
13、每年春天一起去放风筝;
14、经常抱抱你,也要你抱抱;
15、每天早上唤醒你,或者被你唤醒;
16、常常看见你的笑,还有你点头时候边摇头的样子;
17、和你一起逛街,买菜,回家一起做饭;
18、在街上走时和你保持身体的接触,不管是牵着手还是挽着你的胳膊,还是被你揽着肩膀,搂着腰。总之不要和你分开;
19、和你一起看着我们的孩子长大;
20、保持敏感细腻而知道感激的心,在很老的时候仍然会为你特意做给我的红糖荷包蛋掉眼泪,然后抱着你把眼泪蹭在你衬衫的胸前。
第三部分:第21-30件事情
21、和你心平气和地讨论问题,尽量不赌气,不吵架;
22、听我叫笨笨,叫一切我给你起的怪名字,开心的答应我;
23、夜里醒来的时候,亲亲你,不吵醒你;
24、在你需要的任何时候,把我的手伸向你;
25、帮你洗头发的时候,不让洗发水刺到你的眼睛;
26、你看专业书的时候不打扰你;
27、跟你抢电脑,然后把配置更好的那一台让给你用;
28、接听你从海边打来的电话,和你一起听海风,听浪花冲到你脚上时你开心的大叫;
29、买菜的时候顺便买束花回家;
30、你生病的时候轻声和你说话,喂你吃药前先试试水温,在你床前握着你的手念苏东坡、辛弃疾的词给你听。
第四部分:第31-40件事情
31、始终随身带着一张你的照片,有孩子以后就带全家的;
32、每次过马路时都牵着你的手;
33、只要你在家,我就不用钥匙开门,我只按门铃,我要你给我开;
去最神圣最懂爱情的地方结婚
34、常常想着给你惊喜;
35、半夜故意踢开被子,等你醒了给我盖好;
36、学做更多好吃的菜,做好和你一起吃;
37、打雷的时候和你抱在一起睡;
38、每天都给我买牛奶喝;
39、当我们吵架以后,我也许不想跟你说话,但是我要你给我倒杯茶,因为你可能会口渴;
40、头发要一直保留到可以盘起来那么长,插一把簪子,每天晚上你来拔。
第五部分:第41-50件事情
41、和你在同一天里看了日出,再看日落;
42、躺在你的腿上看伤感的爱情片,让眼泪打湿你的裤裤;
43、靠在阳台栏杆上的时候,享受你从背后抱着我的感觉;
44、跟你说谢谢和对不起的时候,都用真心说;
45、突然下雨的时候给你送把伞或者去接你下班;
46、忘记了存折、IP卡密码的时候大声的叫你;
47、你和小孩在公园里疯的时候,我在长椅上看着你们微笑;
48、认真听你说话;
49、万一我有意外,我从高中开始记的所有日记都留给你;
50、每天早晨在你身边醒来,都要感谢上帝让我活着,并且让我们在一起. -
世界上最浪漫的事
2007-04-22 14:13:18
背靠着背坐在地毯上
听听音乐聊聊愿望
你希望我越来越温柔
我希望你放我在心上
你说想送我个浪漫的梦想
谢谢我带你找到天堂
哪怕用一辈子才能完成
只要我讲你就记住不忘
我能想到最浪漫的事
就是和你一起慢慢变老
一路上收藏点点滴滴的欢笑
留到以后坐着摇椅慢慢聊
我能想到最浪漫的事
就是和你一起慢慢变老
直到我们老的哪儿也去不了
你还依然把我当成手心里的宝
每次听到这首歌心里都会有一种莫名的感动!不管是身份有多么显赫的人还是生活的有多么卑微的人都一样的有一个愿望:和心爱的人一起慢慢到老!
记得以前看过这样一个故事:在很久很久以前,人都是联体的,他们过着非常幸福快乐的生活,没有痛苦,没有贫穷,没有灾难,没有……于是上帝想给他们一些磨难,在一个风高月黑的晚上,他派了一个使者来到了人间,他把所有的人都装进了一个魔盒里然后摇啊摇,分撒开来,这样,联体的人都分开了,分散到了世界的各个角落,所以人们从一出生都在寻找自己的另一半,有些人幸运的找到并幸福的生活在一起,有些人历经千辛万苦找到了,却无法幸运的生活在一起,而有些人穷期一生都无法找到自己的另一半……看完这个故事我的心情很沉重,我不知道自己会属于哪一种?可是我的心里依然有一个声音在告诉自己:不管以后将会怎样,我只让自己努力的记住那些快乐的片段,因为痛苦是不值得咀嚼的……
人们常说成事在天谋事在人,我相信是这样的!假如你爱的人出现在你的面前,那么你就要遵从自己内心所做出的决定,排除万难跟他/她在一起,当然前提是他/她是否值得你这样去做!这个世界太复杂了,每个人心里都有阴暗的一面,可是大家都习惯了隐藏或者本身并不自知罢了!很早以前,妈妈就告诉我,选择自己爱人的时候不要去注重他的家庭,因为在这个世界上什么都可以选择,惟独不能选择的就是出生,所以这个人对你来说才是最重要的,你要用长长的一生和他相伴,而不是和他的家人……妈妈是位教师,说话有着很深的哲理,从小我都对他的话坚信不移,因为我知道只有父母才会不参一丝杂质的爱自己的孩子,我坚信这个道理!所以我一直认为女人要爱男人,还是爱他的人比较好,比如天性,人品,即使长相也行,要是有其他,比如成功,地位,男人比较难办,因为这些随时都是可变的!朋友们一直都觉得我是个对爱情太理想化的人,她们问我,假如这个男人没钱,他怎么跟你玩浪漫,怎么逗你开心,即使他很想给你买份礼物,但是他没钱啊……我总是会笑笑的告诉她们:传统赋予男人的责任已经太多了,这个社会给男人的压力也太大了,可是大多数的男人仍然在不停的努力,没有松懈下来,因为即使女人不说,一般的男人也知道自己该做什么,女人要说了,那就不一样,男人会曲解,而女人不一样,做好了别人会说你很好,不好了,也没有人说,所以这个社会的砥柱仍然是男人,中国几千年的封建思想依然在束缚着很多人,而一个女人,只有在思想上独立了,经济上独立了,生活上独立了,才能谈的上尊严和人格的独立……所以我宁愿跟一个什么都没有的人在一起和他一起去奋斗,即使现在没有将来没有,可是只要我们是相爱的,整个过程我们都是在一起进行,我们是在一起慢慢变老!
有这样一个故事:很早以前有个书生,要和他的未婚妻结婚了,可是她却嫁给了别人,于是他变的委靡不振,有天,一个游历的高僧经过,看到他的样子很是感慨,于是高僧拿出他的衣钵在上面用手轻轻一挥,书生看到在一片茫茫大海里有一个赤身裸体的女人,第一个人看见了,摇摇头就过去了,第二个人给她盖了一件衣服,也走开了,只有第三个人把她埋了,那位高僧告诉书生,你只是那个给了她一件衣服的人,所以今生她给了你一段感情,而她要嫁的是那个埋了她的人……当时我在想,每个女人都要嫁给那个埋了她的人吗?假若真是,那谁是那个前生埋了我的人呢?!故事可以在别人的口中越传越远,而我却是看着别人的故事变瘦变老……幸运的是,在我21岁生日的前夕,我碰到了我一生都无法放弃的爱人,这个瘦瘦高高帅帅的男孩子,他很喜欢笑,不知道我是怎样爱上他的,他问我爱他什么?我也不知道,我问他爱我什么?她说爱我的善良,聪明和独立……我告诉他那是因为我爱你所以才会什么事情都替你着想,不舍得给你压力,他就说他还爱我的直率,因为我有什么都会跟他去讲,因为我知道,相爱的人如果能够做到不断的很好的沟通,即使是产生了矛盾,矛盾也会很快的解决剩下的就是幸福了!感情是需要两个人不断的去经营的,而不是一方无止的付出或一方无止的索取……虽然有无数个人说时间久了两个人之间就没有爱情了,有的只是一种习惯或亲情而已,可是我仍然相信,只要开始有爱情,以后即使变成亲情,那也是爱情的另一种样子,一般的亲情,是比不了的!
其实写了这么多,都是因为我想我的高高了,在有两个月他才可以放假,我才可以见到他,说真的,每天我都是一个人在孤单寂寞的行走着,下班回家以后,我总是从一个房间飘到另一个房间,假如碟机里没有音乐,不开电视的话,静的可以听见自己的心跳声,可是这种等待或许就已经是爱情本身了,所以希望那些在一起的恋人们能够珍惜你们在一起的时间!而我,会继续等待,等待有天成为高高最美丽的新娘,和他一起慢慢变老,我想,这将是我这辈子最幸福,最浪漫的事……
珍惜每一个爱自己和自己所爱的人吧,他/她们可以是自己父母,可以是兄弟姐妹,可以是恋人,可以是朋友……总之,只要是以心相交,以诚相待会使我们的每一天都过的无比的塌实!
祝天下有情人终成眷属! -
删除U盘病毒出高招
2007-04-19 09:18:52
近期,其实也算不上近了,这种类型的病毒自“古”就有!
以前网络不太兴盛的时候,软盘成为程序传播的理想载体,
而从电脑病毒问世的那一天,病毒就将各个时期的理想载体也作为自己传播的最佳途
径。今天U盘成为一种便捷、时尚的数据传播载体,病毒也便瞄上了她!
言归正传: 今天我想写一下自己动手删除U盘顽固病毒的过程。
先说一下中毒症状!
U盘盘符在我的电脑里面无法正常双击打开,而必须通过右键单击出现下拉菜单
选择“打开”方能打开U盘进行正常操作。
起初这种病毒通过U盘传播,后来就直接传播到了硬盘里面,硬盘中毒的症状也是
无法通过双击打开,必须通过右键单击选择下拉菜单中的“打开”方能正常操作
硬盘数据,而右键菜单最上面显示的是“Auto”。
说起来这种类型的病毒破坏力不强,就是有些烦人。给正常使用带来一些麻烦。
既然影响了日常使用,那我们就得想办法清楚她!让我感到很纳闷的就是,这种病毒
目前几乎所有的杀毒软件对她都“视而不见”!郁闷ing....
既然杀毒软件不肯出手,那只有自己动手了!
前天遇到一个U盘就是出现无法正常打开的问题,将U盘所有数据备份出来后,
对U盘进行格式化,结果提示无法格式化;遂将U盘内所有可见的文件,文件夹全部
删除,最后发现有一个空文件夹无法删除,格式化仍然无效。
好了,现在可以确定的是这个空文件夹(在windows下文件夹内什么也没有)
里面肯定有病毒关联文件。祭出当今最流行的杀毒软件卡巴斯基给我“杀”!
报告结果让我大跌眼镜:扫描5个文件,一切正常!
杀毒软件居然私下里“放水”!正在生气的时候随便点击了卡巴斯基的扫描选项
突然想起来,既然U盘里面的东西能删除的都删除了,那剩下的这5个文件不就是那
可恶的病毒文件吗!
好既然知道了病毒源名称,那就更好办了,祭出第二把除毒大旗--DOS
5个文件的名称卡巴斯基已经明明白白的告诉我们了,但在windows你根本就看
不到,也就是说他们是隐藏而且作为系统文件导致无法删除、无法格式化。
通过DOS进入U盘根目录,用attrib 命令去掉病毒文件的隐藏、存档、只读属
性,具体命令如下:
attrib -h -s -r desktop.ini
将根目录和那个删除不了文件夹里面的所有文件全部去掉隐藏、存档、只读属
性后,删除病毒文件,格式化U盘彻底删除病毒。
注: 若去掉隐藏、存档、只读属性后仍然无法删除文件,就需要在DOS下用edit命
令对带毒文件进行编辑,将所有文件内容清空后即可安全删除!
-
高斯赛德尔迭代法
2007-04-19 09:13:33
function[x,k,index]=Gau_Seid(A,b,ep,it_max)
if nargin<4 it_max=100;end
if nargin<3 ep=1e-5;end
n=length(A);k=0;
x=zeros(n,1);y=zeros(n,1);index=1;
while 1
y=x;
for i=1:n
z=b(i);
for j=1:n
if j~=i
z=z-A(i,j)*x(j);
end
end
if abs(A(i,j))<1e-10|k==it_max
index=0;return;
end
z=z/A(i,j);x(i)=z;
end
if norm(y-x,inf)<ep
break;
end
k=k+1;
end
>> A=[20 2 3;1 8 1;2 -3 15];b=[24 12 30]';ep=1e-5;
>> [x,k,index]=Gau_Seid(A,b,ep)
x =
-5.0769
12.0000
5.0769
k =
34
index =
1
-
历城二中~人生在勤
2007-04-12 20:25:36
历城二中~人生在勤在高中的三年中,我们做到了:
学会做人,学会处世;
学会合作,学会学习;
静思苦学,志存高远;
自强自信,稳定心态;
遵守纪律,关心集体。
不负恩师厚望,不负父母期盼;
不负十二年寒窗苦读,不负青春梦想!
态度决定一切,一切皆有可能,
我们永不言弃!!! -
江苏各大高校排名
2007-04-07 19:32:46
1.南京大学,历史源远流长是中央大学和金陵大学合并的产物。虽然沉默了很长一段时间,但是九十年代的飞跃使他重新成为中国最知名的大学中的一员。他当之无愧是江苏省高校 的老大。 2.东南大学,就是原来的南京工学院,继承了中央大学的工科部分,实力当然不可小觑。而且他是中国工学院的开山鼻祖,地位可想而知。可惜它放弃了“南京工学院”这一块金 字招牌。惹得国外校友竟然不知道东南大学是什么。这几年它发展的速度变得不如以往,而且喜欢和南京大学争中央大学的传人;和东北大学争东大的简称,更是令人气愤。但是他的 工科尤其是建筑学在中国除了上海的同济大学可以和它叫板还没有出其右者。今年发展又有回升的迹象。因此它江苏省第二高校的地位到现在为止还是十分坚固的。 3.南京理工大学,资金充足校园面积广大,对外形象十分不错,这几年发展势头异常迅猛!在学术上的确是令人感到吃惊。除了常常和南京航空航天大学闹矛盾其余都不错。勉强 能算老三。 4.南京航空航天大学,老牌的军事有关的学校,资金充足。现在正在开辟江宁校区以求未来得更大发展,是江苏省不可缺少的名牌院校。 5.南京农业大学,的确是一所很不错的学校。实力完全可以和中国农业大学分个高低。历史也是悠久。但是由于“农业”两个字害了它不少的毕业生,真是十分可惜。好在它可能 和南京师范大学合并成为“新金陵大学”,有了省政府撑腰前途无量。 4.中国矿业大学 校园面积真是大的惊人,而且还有中国矿业大学(北京)它的实力不用多说。可惜两个“矿业”把这个学校害苦了。只有它地处徐州这个偏远的地方经济不是十分发达(和苏南的主 要城市相比)抑制了它的进一步发展,但是在如此环境下此校已然创造了如此辉煌的战果真是不能不令人感到敬佩。 6.南京师范大学本来根本成不了气候,但是由于江苏省政府在“九五”期间的重点发展,历经十年的韬光养晦如今学校得到了惊人的发展,现在它已经可以说是一所重点的综合性 大学了。2002年它就要组建“新金陵大学”,江苏省政府已然要对它大力发展,其前途可以说是无法限量。这是我们不得不承认的事实。但是由于其招生规模过于庞大,学生质量 可以说是参差不齐。这就不得不阻碍它进一步发展。不管如何,它的确是江苏省最有发展前途的学校,这是江苏省现在任何一所高校比不上的。 7. 苏州大学, 根据此学校的简介上看是旧中国最知名的私立大学“东吴大学”的传人。事实是不是这样还是有待斟酌的。那我们就算它有历史好了。和南京师范大学一样。本来苏州大学前的那些 小学校依靠自身发展是根本不可能有什么出头之日的。但是由于省政府的大力发展现在已经是今非昔比了,而且发展的非常非常不错。它现在已经是中国比较知名的综合类大学了,尤 其是在江苏省。而且在“十五”期间省政府依然要对它负责,前途可以说还是不错的,但是再怎么发展也就这样了,“九五”期间那样的情景是不会在出现了。地理位置也不错,苏州 是个很美丽的地方。 8.河海大学,原来不错,是南京高校的老三,可惜由于这么多年来的极其缓慢发展越来越落后了。而且学生的素质有待提高。河海大学再像今天如此发展迟早有一天会变成和某某 学院一样的地位。但是要它奋发图强就现在来看好像不太可能。它的管理阶层有着很大的问题。真是可惜了。华水没落了。说河海大学是最没有希望的大学这一点不为过! 9.中国药科大学学校,不善于宣传自己。到现在为止对外大家也只知道一个“丁家宜”。但是实力是有的。但是发展潜力比较小,不知还能坚持几年,这要我们拭目以待。本年度 排在第九位,明年不知道如何? 10.南京工业大学,是一所老学校,也是一所新兴的学校。就是南京化工大学和南京建筑工程学院的合体,实力不过如此。但是还是由于江苏省政府把它定为“十五”期间重点发 展的工科院校。鉴于南京师范大学和苏州大学的先例,我们可以猜想到它的发展不是我们所能像想的到的。再说它现在的实力要远远高出当年的南京师范学院,其发展更是不可限量。 他们的校长的确是一个非常难得的好校长,国家自然科学一等奖得者,我们在《扬子晚报》上看到过关于他的报道!它们的学生也是十分团结,并且此学校在江苏省没有什么冤家对头 这更有利于其发展。希望它能吸取南京师范大学的教训,把好招生关。前途无量! 11.南京医科大学,实在是没有什么好说的了。只能和南京大学或是金陵大学合并。 12.南京林业大学,学校真的很美丽,学生也是很友好上进。实力也有。但是还是“林业”两个字把大家害苦了。改掉名字拓宽发展领域还是有前途的。好像要改成“南京科技大 学”是不是,不太清楚。 13.江南大学,不知道无锡轻工业大学在搞什么鬼,改成了“江南大学”还以为是江南学院改名字了。实在是搞不懂它怎么能是重点大学。实力和称号实在是不相称。但是实力还 有。在江苏省也有着其它院校不可取代的地位。祝愿明年进入前十名。 14.江苏大学,在七十年代学校实力在全国来说也是不可小觑的,但是现在是21世纪了,学校越来越不行了这是不争的事实。期待着它的再一次腾飞。江苏理工大学改名字--“江苏大学”,其实也没有这个必要“江苏理工大学”不是也不错么?还有的就是镇江这个地方不是什么好地方制约了他的发展。 15.南京中医药大学,和南京医科大学或是中国药科大学合并还有活路。 16.南京邮电学院,学校虽然好像不错不应该有这么差的排名,但是由于自身发展领域过于狭小,并且它的学生毕业都赚钱去了很少在学术领域工作的,这又是一个影响排名因素 。综合上来讲不好,也是期待着何某所院校合并。和“南京工业大学”合并到不失为明智之举。都在一条马路上,都是工科院校么!当然这好像不太可能,南京邮电学院现在还沉浸在 就业率100%的荣誉之中。其实这是由于邮电行业的垄断性造成的,不知道10年后这所学校会如何。我们拭目以待! 17.南京信息工程大学,虽是重点大学但是规模太小,研究领域极其狭小。还是合并一条路。南京大学还是欢迎它的。 18.淮海工学院,连云港的骄傲,就不评价了 19. 扬州大学,虽然有国家主席撑腰何以前那么多小学校相比那是有天壤之别,但是由于发展时间太短也不是江苏省政府“九五”“十五”照顾的对象,前途未卜。不能只靠主席过一辈 子。 20.南京经济学院。这两年经济类,管理类不吃香。没有办法发展的太差!也没有什么历史,委屈你了 21..南京审计学院,毕业找工作不错。别的就没有什么了。 22.江苏石油化工学院,就整个中国来说凡是和“石油化工”联系在一起的学校都不怎么样。这所学校当然也逃不了。赶快和常州的几个学校合并说不定还能生存下去。 23.南通工学院,实在想不出它有什么出路,还是合并么? 24.盐城工学院,和南通工学院一样的,好像还不如南通工学院,地理位置更不好。 25.南京工程学院,几个专科院校合并的产物。不说什么了。 26.南京艺术学院,在其自身领域还不错,就这么下去好了 27.江苏科技大学 28.镇江医学院,它的痛苦谁知道? 29.徐州医学院,有自己的苦衷。基层学校的发展少有前途(如果未来他还存在) 30.南通医学院 31.南通师范学院,一致认为如果这个名字未来还存在,就算50年它也不会有出头之日 32.苏州城建环保学院 ,他的出路就是变成苏州大学一个学院 33.南京体育学院,除了南京师范大学的体育学院,也算是垄断院校了,保持原样。或者合并。 34. 金陵职业大学,就这样为社会培养应用型人才也是不错。前途还是有的,大不了就这么下去好了,反正还不是本科院校。要过些日子才是本科院校。 35.哓庄学院 36.三江学院,由于在它得在校园内开始实行本科教育就排上他好了。他是江苏省最早的私立院校,祝愿他一路走好! -
2.5.2求交线算法
2007-04-07 10:51:22
2.5.2求交线算法
求交线显然是指求面与面的交线,下面讨论几种常见的情况。
1、平面与平面的交线
在CAD中一般使用平面上有界区域。先考虑最简单的情形。两个平面区域分别由P(u, w), Q(s, t), u, w, s, t? [0, 1]定义。如果它们不共面而且不分离,则必交于一直线段。这条直线必落在P(u, w)-Q(s, t)=0所定义的无限直线上。注意这是个含有四个未知数,三个方程式的方程组,只要分别与八条边界线方程:u=0, u=1, w=0, w=1, s=0, s=1, t=0, t=1联立,即可求出线段的两个端点的参数。在上述方程组中,只要找到两组解,就可以不再对剩余其它方程组求解。找到的两组解就是所求的交线段端点参数。
当两个一般的多边形(即既可能是凸的,也可能是凹的,甚至可能带有内孔)相交时,可能有多段交线。我们可以把两个多边形分别记为A和B,用如下的算法求出它们的交线:
(1)把A的所有边与B求交,求出所有有效交点;
(2)把B的所有边与A求交,求出所有有效交点;
(3)把所有交点先按y,再按x的大小进行排序;
(4)把每对交点的中点与A和B进行包含性检测,若该中点即在A中又在B中,则该对交点定义了一条交线段。
2、平面与二次曲面的交线
求平面与二次曲面的交线有两种方法:代数法和几何法。
用代数法考虑平面与二次曲面求交问题时,可以把二次曲面表示为代数形式,
Ax2+By2+Cz2+2Dxy+2Eyz+2Fxz+2Gx+2Hy+2Iz+J=0
可以通过平移与旋转坐标变换把平面变为XOY平面,对二次曲面进行同样的坐标变换。由于在新坐标系下平面的方程为z=0,所以新坐标系下二次曲面方程中,把含z项都去掉即为平面与二次曲面的交线方程(在新坐标系下)。对该交线方程进行一次逆坐标变换即可获得在原坐标系下的交线方程。在具体实现时,交线可以用二元二次方程系数表示(代数表示),辅之以局部坐标系到用户坐标系的变换矩阵。这种方法的缺点是,每当需要使用这些交线时,都要进行坐标变换。例如,判断一个空间点是否在交线上,必须先对它进行坐标变换,变到z=0平面上,再进行检测。需要绘制该交线时,也要先在局部坐标系下求出点坐标,再变换到用户坐标系下的坐标。所以交线采用另一种方法(几何表示)更合理。几何方法存储曲线的类型(椭圆、抛物线或双曲线),以及定义参数(中心点、对称轴、半径等大小尺寸)的数值信息,使用局部坐标系到用户坐标系的变换,把局部坐标系下的定义参数变换到用户坐标系直接使用。这第二种方法使用较少的变换,但需要用计算来判断曲线的种类,及计算曲线的定义参数。由于浮点运算的不精确性,容易发生判错类型以及定义参数误差过大的问题。
当平面与二次曲面的交线需要精确表示时,往往采用几何法求交。二次曲面采用几何表示,平面与二次曲面求交时,根据它们的相对位置与角度(根据定义参数),直接判断交线类型,其准确性大大优于用代数法计算分类的方法。几何法不需要对面进行变换,所以只要通过很少的计算就可以得到交线的精确描述。由于存储的信息是具有几何意义的,所以判断相等性、相对性等问题时,可以确定有几何意义的容差。下面以平面一球求交为例,说明几何法求交算法。
平面用一个记录p表示,p的两子域p.b, p.w分别代表平面上一点与平面法向量。球面用记录s表示。它的两个子域s.c, s.r分别代表球面中心和半径。则可写出平面与球面相交的算法如下:
plane_sphere_intersect(p, s)
plane p;
sphere s;
{
d=球面中心到平面的有向距离;
if(abs(d)=s.r)
{ 二个面相交于一(切)点s.c-d * p.w;}
else if (abs(d)>s.r)
{ 两个面无交;}
else
{ 所求交线是圆。其圆半,半径,圆所在平面法向量为
c=s.c-d * p. w;
r=sqr t(s.r2-d2);
w=p.w;
}
}
一个平面与一个圆柱面可以无交、交于一条直线(切线)、二条直线、一个椭圆或一个圆,可以用两个面的定义参数求出它们的相对位置关系和相对角度关系,进而判断其交属于何种情况,并求出交线的定义参数。平面与圆锥的交线也可类似求出。
-
平面与参数曲面的交线
最简单的方法是把参数曲面的表示(x(s,t), y(s,t), z(s,t))代入平面方程
ax+by+cz+d=0
得到用参数曲面的参数s、t表示的交线方程
ax(s,t)+by(s,t)+cz(s,t)+d=0
另一种方法是用平移和旋转变换对平面进行坐标变换,使平面成为新坐标系下的xoy平面。再用相同的变换应用于参数曲面方程得到参数曲面在新坐标系下的方程
(x*, y*, z*)=(x*(s,t), y*(s,t), z*(s,t))
由此得交线在新坐标系下的方程为z*(s, t)=0
-
-
2.4 字符的生成 2.5 图形求交
2007-04-07 10:50:24
2.4 字符的生成
在计算机图形学中,字符可以用不同的方式表达和生成。常用的方法有点阵式、矢量式和编码式。
2.4.1 点阵式字符
点阵式字符将字符表示为一个矩形点阵,由点阵中点的不同值表达字符的形状。常用的点阵大小有5? 7、7? 9、8? 8、16? 16等等。图2.4.1(a)所示的字母“P”的点阵式表示例子。在这种8? 8网格中的字形比较粗糙,但当点阵变大时,字型可以做得非常漂亮。
使用点阵式字符时,需将字库中的矩形点阵拷贝到buffer中指定的单元中去。在拷贝过程中,可以施加变换,以获得简单的变化。图2.4.1(b)~(d)列出了P字母原型的一些变化例子。相应的变换算法是:
(a) (b) (c) (d)

图2.4.1 点阵式字符及其变化
图(b)变成粗体字。算法是:当字符原型中每个象素被写入帧缓存寄存器的指定位置xi, yi时,同时被写入xi+1, yi。
图(c)旋转90? 。算法是:把字符原型中每个象素的x, y坐标彼此交换,并使y值改变符号后,再写入帧缓存寄存器的指定位置。
图(d)斜体字。算法是:从底到顶逐行拷贝字符,每隔n行,左移一单元。
此外,还可以对点阵式字符作比例缩放等其他一些简单的变换。但是对点阵式字符作任意角度的旋转等变换,是比较困难的操作。
由于光栅扫描显示器的普遍使用,点阵式字符表示已经成为一种字符表示的主要形式。从字库中读出原字型,经过变换拷贝到buffer中去的操作,经常制成专门的硬件来完成。这就大大加快了字符生成的速度。
2.4.2 矢量式字符
矢量式字符将字符表达为一个点坐标的序列,相邻两点表示一条矢量,字符的形状便由矢量序列刻划。图2.4.2示出用矢量式表示的字符“B”。“B”是由顶点序列{a, b, c, d, e, f, e, g, h, I, j, k ,a, l}的坐标表达。
调用矢量式字符的过程相当于输出一个polyline。由于矢量式字符具有和图形相一致的数据结构,因而可以接受任何对于图形的操作,如放大、旋转,甚至透视。而且,矢量式字符不仅可用于显示,也可用于绘图机输出。

图2.4.2 矢量式表示字符“B”
2.4.3 方向编码式字符
方向编码式字符用有限的若干种方向编码来表达一个字符,常用的如8方向编码。图2.4.3示出8个方向的编码为0~7,其中编码为偶数和0的固定长度为1,编码为奇数的固定长度为
。一个字符就可以表示为一连串方向码。图2.4.4(a)示出字母“B”的方向矢量构成。这样,“B”就表示为8方向编码:{000012344400012344440666666}。方向编码式字符很容易被填入帧缓存寄存器中予以显示(图2.4.4(b)),方向编码所占的空间比较小,它也能接受一些特定的变换操作,如按比例在x和y两个方向放大或缩小以及以45? 角为单位的旋转,但难以进行任意角度的旋转。

图2.4.3 图2.4.4
方向编码既可用于字符的显示,也可用于字符的绘图机输出
2.4.4 轮廓字型技术
当对输出字符的要求较高时(如排版印刷),需要使用高质量的点阵字符。对于GB2312-80所规定的6763个基本汉字,假设每个汉字是72X72点阵,那么一个字库就需要72X72X6763/8=4.4兆字节存储空间;不但如此,在实际使用时,还需要多种字体(如基本体、宋体、仿宋体、黑体、楷体等),每种字体又需要多种字号。可见,直接使用点阵字符方法将耗费巨大的存储空间。因此把每种字体、字号的字符都存储一个对应的点阵,在一般情况是不可行的。
解决这个问题一般采用压缩技术。对字型数据压缩后再存储,使用时,将压缩的数据还原为字符位图点阵。压缩方法有多种,最简单的有黑白段压缩法,这种方法简单,还原快,不失真,但压缩较差,使用起来也不方便,一般用于低级的文字处理系统中。另一种方法是部件压缩法。这种方法压缩比大,缺点是字型质量不能保证。三是轮廓字型法,这种方法压缩比大,且能保证字符质量,是当今国际上最流行的一种方法,基本上也被认为是符合工业标准化的方法。
轮廓字型法采用直线、或者二/三次Bezier曲线的集合来描述一个字符的轮廓线。轮廓线构成一个或若干个封闭的平面区域。轮廓线定义加上一些指示横宽、竖宽、基点、基线等的控制信息,就构成了字符的压缩数据。这种控制信息用于保证字符变倍时引起的字符笔划原来的横宽/竖宽变大变小时,其宽度在任何点阵情况下永远一致。采用适当的区域填充算法,可以从字符的轮廓线定义产生的字符位图点阵,区域填充算法可以用硬件实现,也可以用软件实现。
由美国Apple和Microsoft公司联合开发的TrueType字型技术就是一种轮廓字型技术,已被用于为Windows中文版生成汉字字库。当前占领主要的电子印刷市场的我国北大方正和华光电子印刷系统,用的字型技术是汉字字型轮廓矢量法。这种方法能够准确地把字符的信息描述下来,保证了还原的字符质量,又对字型数据进行了大量的压缩。调用字符时,可以任意地放大、缩小或进行花样变化,基本上能满足电子印刷中字型质量的要求。轮廓字型技术有着广泛的应用。到目前为止在印刷行业中使用最多,随着Ms-Windows的大量使用,在CAD、图形学等领域也将变得越来越重要。
2.5 图形求交
在计算机图形学中常常会遇到求交计算。例如,在进行扫描线区域填充时要求线段的交点,许多消隐算法需要进行直线和平面多边形的求交,等等。求交运算往往是比较复杂的,为了减小计算量,在进行真正的求交计算之前,往往先用凸包等辅助结构进行粗略的比较,排除那些显然不相交的情形。求交计算是CAD系统的重要部分。它的准确性与效率直接影响CAD系统的可靠性与实用性。
在数学上两个浮点数可以严格相等,但计算机表示的浮点数有误差,所以当两个浮点数的差的绝对值充分小时(例如,小于某个正数? ),就认为它们相等。相应地,求交运算中也要引进容差。当两个点的坐标值充分接近时,即其距离充分近时,就被认为是重合的点,直观地说,点可看作半径为? 的球,线可看作半径为? 的圆管,面可看作厚度为2? 的薄板。一般取? =10-6或更小的数。
求交问题可以分为求交点和求交线两类。本节的讨论不涉及自由曲线曲面,有关自由曲线曲面的求交问题将在2.7和2.8节讨论。
2.5.1求交点算法
求交点可以分两种情况:求线与线的交点以及求线与面的交点。下面首先讨论线与线的交点的求法。。
1、直线段与直线段的交点
假设二条直线的端点分别为P1,P2,Q1,Q2,则它们可以用向量形式表示为:
P(t)=A+Bt (0? t? 1)
Q(s)=C+Ds (0? s? 1)
其中,A=P1,B=P2-P1,C=Q1,D=Q2-Q1。
构造方程
A+Bt=C+Ds (2-5-1)
对三维空间中的直线段来说,上述方程实际上是一个二元一次方程组,由三个方程式组成。可以从其中两个解出s, t,再用第三个验证解的有效性:若第三个方程成立则说明找到了解,否则说明两条直线不相交。当所得的解(ti, si)是有效解时,可用二个线段方程之一计算交点坐标,例如P(ti)=A+Bti。
我们还可以根据向量的基本性质,直接计算s与t:对(2-5-2)两边构造点积得
(C? D)·(A+Bt)=(C? D)·(C+Ds)
由于C? D同时垂直于C和D,等式右边为零。故有

类似地有

完整的算法还应判断无解与无穷多解(共线)的情形,以及考虑数值计算误差造成的影响。
2、直线段与二次曲线的交点
不失一般性,考虑平面上一条直线与同平面的一条二次曲线的交。
假设 曲线方程为 f(x, y)=0,
直线段方程为 (x, y)=(x1+tdx, y1+tdy),
则在交点处有 f(x1+tdx, y1+tdy)=0
当曲线为二次曲线时,上述方程可写为
at2+bt+c=0
用二次方程求根公式即可解出t值。
3、圆锥曲线与圆锥曲线的交点
圆锥曲线有代数法表示、几何法表示与参数法表示。在进行一对圆锥曲线的求交时,把其中一条圆锥曲线用代数/几何法表示为隐函数形式,另一条表示为参数形式(如二次NURBS曲线)。将参数形式代入隐函数形式可得关于参数的四次方程,可以使用四次方程的求根公式解出交点参数。得到交点后可再验证交点是否在有效的圆锥曲线段上。
下面讨论线与面的交点的求法。
1、直线段与平面的交点

图2.5.1 线段与平面求交
考虑直线段与无界平面的求交问题,如图8.3.6所示。把平面上的点表示为P(u, w)=A+uB+wC,直线段上的点表示为Q(t)=D+tE,二者的交点记为R。假设线段不平行于平面,则它们交于R=P(u, w)=Q(t),即
A+uB+wC=D+tE
等式两边点乘(B? C),得
(B? C)·(A+uB+wC)=(B? C)·(D+tE)
由于B? C既垂直于B,又垂直于C,故有
(B? C)·A=(B? C)·(D+tE)
可解出

类似求得


如果是直线与平面区域求交点,则要进一步判断点是否在平面上的有效区域中,其算法可参见2.5.3节。
2、圆锥曲线与平面的交点
圆锥曲线与平面求交时,可以把圆锥曲线表示为参数形式,并把圆锥曲线的参数形式代入平面方程,即可得到参数的二次方程进行求解。
- 圆锥曲线与二次曲面的交点
圆锥曲线与二次曲面求交时,可把圆锥曲线的参数形式代入二次曲面的隐式方程,得到参数的四次方程,用求根公式求解。
-
2.3.3 种子填色算法
2007-04-07 10:46:16
2.3.3 种子填色算法
种子填色又称边界填色(Boundary Filling)。它的功能是:给出多边形光栅化后的边界位置及边界色代码boundary,以及多边形之内的一点x, y位置,要求将颜色color填满多边形。
通常采用的填法有两种:四邻法(4-connected)和八邻法。四邻法是已知x, y(图2.3.6(a)的黑色象素)是多边形内的一点,据此向上下左右四个方向测试(图2.3.6(a)中打勾的象素)、填色、扩散。四邻法的缺点是有时不能通过狭窄区域,因而不能填满多边形。如图2.3.6(b)所示,左下角方形中的种子(打点的象素)不能扩散到右上角的方形中,因为采用四邻法通不过中间的狭窄区域。八邻法是已知x, y(图2.3.6 (c)中黑色的象素)为多边形内的一点,即种子,据此可向周围的八个方向(图2.3.6(c)中打勾的象素)测试、填色、扩散。八邻法的缺点是有时要填出多边形的边界。如图2.3.6(d)所示的边界,按八邻法就会将色彩涂出多边形。由于填不满往往比涂出更易于补救,因此四邻法比八邻法用的更普通。
四邻法种子填色基本程序如程序2.3.2所示。这种程序书写简洁,但运行效率不高,因为包含有多余的判断。在它的基础上可以写出各种改进的算法[8]。
void seed_filling (x, y, fill_color, boundary_color)
int x, y, fill_color, boundary_color;
{
int c;
c=inquire_color(x, y);
if((c< > boundary_color) && (c< > fill_color))
{
set_pixel(x, y, fill_color);
seed_filling(x+1, y, fill_color, boundary_color);
seed_filling(x-1, y, fill_color, boundary_color);
seed_filling(x, y+1, fill_color, boundary_color);
seed_filling(x, y-1, fill_color, boundary_color);
}
}
程序2.3.2 四邻法种子填色程序

图2.3.6 四邻法和八邻法种子
-
四邻法
-
四邻法不能填满此多边形
-
八邻法
-
八邻法会涂出此多边形
-
-
2.3.2 扫描线填色算法
2007-04-07 10:44:32
2.3.2 扫描线填色算法
一、算法的基本思想
多边形以n, x_array, y_array形式给出,其中x_array,y_array中存放着多边形的n个顶点的x, y坐标。扫描线填色算法的基本思想是:
用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类,将分类后的交点成对取出,作为两个端点,以所填的色彩画水平直线。多边形被扫描完毕后,填色也就完成。
上述基本思想中,有几个问题需要解决或改善。它们是:
1. 左、右顶点处理 当以1, 2, 3的次序画多边形外框时,多边形的左顶点和右顶点如图2.3.3 (a)、(b)所示的顶点2。它们具有性质:
左顶点2:y1<y2<y3
右顶点2:y1>y2>y3
其中y1, y2, y3是三个相邻的顶点的y坐标。
(a)左顶点 (b)右顶点

图2.3.3
当扫描线与多边形的每个顶点相交时,会同时产生2个交点,这是因为一个顶点同属于多边形之两条边的端点。这时,如果所交的顶点是左顶点或右顶点,填色就会因奇偶计数出错而出现错误。因此,对多边形的所有左、右顶点作如下处理;
左、右顶点的入边(以该顶点为终点的那条边),即1, 2边之终点删去。即:
对于左顶点:入边(x1, y1)(x2, y2)修改为(x1, y1)(
,y2-1);对于右顶点:入边(x1, y1)(x2, y2)修改为(x1, y1)(
,y2+1);其中m=

,即入边之斜率。对于多边形的上顶点(y2>y1 & y2>y3)或下顶点(y2<y1 & y2<y3),奇偶记数保持正确,因此不必修改,保持相邻边原状不变。
2. 水平边处理 水平边(y1=y2)与水平扫描线重合法求交点。因此,将水平边画出后删去,不参加求交及求交以后的操作。
3. 扫描线与边的求交点方法采用递归算法 边(x1, y1)(x2, y2)与扫描线i+1的交点为:

(当交点不为x1, y1时)
否则,交点为x1, y1。
由上式可知,求交点只须做两个简单的减法。
4. 减少求交计算,采用活性边表 对于一根扫描线而言,与之相交的边只占多边形全部边的一部分。因此,在基本算法思想中,每根扫描线与多边形所有边求交的操作是一种浪费,需要加以改善。活性边表(Active List of Side)的采用将多边形的边分成两个子集:与当前扫描线相交的边的集合,以及与当前的扫描线不相交的边的集合。后者不必予以求交,这样就提高了算法的效率。
(a) (b)在scan1的情况

图2.3.4 活性边表及其指针的表示
活性边表的构成方法是:
1)将经过左、右顶点处理及剔除水平边后的多边形之各边按照max y值排序,存入一个线性表中。表中每一个元素代表一根边。第一个元素是max y值最大的边,最后一个元素是max y值最小的边。图2.3.4 (a)中的多边形所形成的线性表如(b)所示。其中F点和B点的y值相等,且为全部多边形的max y的最大值。因此FG, FE, AB, BC等四边排在表之首。而C点的y值>E点的y值,所以CH排在DE前面,余类推。在max y值相等的边之间,按任意次序排列。
2)在上述线性表上加入两个指针first和last,即形成活性边表。这两个指针之间是与当前扫描线相交的边的集合和已经处理完(即扫描完)的边的集合。这两者的区分方法是在处理完的边上加上记号:? y=0。在last指针以后的是尚未与当前扫描线相交的,在first指针以前的是已经处理完了的边。对于图2.3.4 (a)中扫描线scan1的情况下,图2.3.4 (b)中列出first, last的位置。如果扫描线由上而下移到了scan2的位置,则活性边表的first应指向AB,last应指向CH。每根扫描线只须与位于first, last之间的,而且? y? 0的边求交即可。这就缩小了求交的范围。
3)活性边表中每个元素的内容包括:
·边的max y值,记为y_top;
·与当前扫描线相交点的x坐标值,记为x_int;
·边的y方向当前总长。初始值为y2-y1。记为? y;
·边的斜率倒数:
,记为x_change_per_scan。4)活性边在每根扫描线扫描之后刷新。刷新的内容有2项:
·调整first和last指针字间的参加求交的边元素之值:? y=? y-1; x_int = x_int - x_change_per_scan;
·调整first和last指针,以便让新边进入激活范围,处理完的边退出激活范围:
当first所指边的? y=0时,first=first+1;
当last所指的下一条边的y_top? 下一扫描线的y值时,last=last+1。
二、扫描线填色程序
程序2.3.1示出扫描线填色算法的程序。主程序名为fill_area(count, x, y),其中参数x, y是两个一维数组,存放多边形顶点(共count个)的x和y坐标。它调用8个子程序,彼此的调用关系如图2.3.5所示。各子程序的功能为:

图2.3.5 fill_area的程序结构
typedef struct {
int y_top;
float x_int;
int delta_y;
floaat x_change_per_scan;
} EACH_ENTRY;
EACH_ENTRY SIDES[MAX_POINT];
int x[MAX_POINT], y[MAX_POINT];
int side_count, first_s, last_s, scan, bottomscan, x_int_count, r;
fill_area(count, x, y)
int count, x[ ], y[ ];
{
sort_on_bigger_y(count);
first_s=1;
last_s=1;
for (scan=sides[1].y_top; scan>bottomscan ?; scan - -)
{
up date_first_and_last(count, scan);
process_x_intersections(scan, first_s, last_s);
draw_lines (scan, x_int_count, first_s);
update-_sides_list ( );
}
}
void put_in_sides_list(entry, x1, y1, x2, y2, next_y);
int entry, x1, y1, x2, y2, next_y;
{
int maxy;
float x2_temp, x_change_temp;
x_change_temp = (float) (x2-x1) / (float) (y2-y1);
x2_temp =x2; /*以下为退缩一点操作. */
if ((y2>y1) && (y2<next_y)) {
y2 - - ;
x2_temp - = x_change_temp;
}
else {
if ((y2<y1) && (y2 >next_y)) {
y2++;
x2_temp+=x_change_temp;
}
}
/* 以下为插入活性表操作. */
maxy = (y1 > y2)? y1: y2;
while (( entry >1) && (maxy > sides [entry -1]. y_top))
{
sides[entry]=sides [entry ?];
entry - -;
}
sides[entry]. y_top=maxy;
sides[entry]. delta_y =abs(y2-y1)+1;
if (y1>y2)
sides[entry]. x_int =x1;
else{
sides[entry].x_int=x2_temp;
sides[entry]. x_change_per_scan=x_change_temp;
}
void sort_on_bigger_y(n)
int n;
{
int k, x1, y1;
side_count=0;
y1=y[n];
x1=x[n];
bottomscan=y[n];
for (k=1; k<n+1; k++)
{
if (y1 ! =y[k]) {
side_count ++;
put_in_sides_list(side_count, x1, y1, x[k], y[k]);
}
else {
move ((short)x1, (short)y1);
line((short)x[k], (short)y1, status);
}
if (y[k] <bottomscan) bottomscan=y[k];
y1=y[k]; x1=x[k];
}
}
void update_first_and_last(count, scan)
int count, scan;
{
while((sides[last_s+1]. y_top>=scan) && (last_s <count)) last_s ++;
while(sides[first_s]. delta_y = = 0) first_s ++;
}
void swap(x, y)
EACH_ENTRY x, y;
{
int i_temp;
float f_temp;
i_temp=x.y_top; x.y_top=y.y_top; y.y_top=i_temp;
f_temp=x.x_int; x.x_int=y.x_int; y.x_int=f_temp;
i_temp=x.delta_y; x.delta=y.delta_y; y.delta_y=i_temp;
f_temp=x.x_change_per_scan; x. x_change_per_scan=y. x_change_per_scan; y.x.
change_per_scan=f_temp;
}
void sort_on_x(entry, first_s)
int entry, first_s;
{
while((entry > first_s) && (sides[entry]. x_int < sides[entry-1]. x_int))
{
swap (sides[entry], sides[entry-1]);
entry - -;
}
}
void process_x_intersections(scan, first_s, last_s)
int scan, first_s, last_s;
{
int k;
x_int_cout=0;
for(k=first_s; k<last_s+1; k++)
{
if(sides[k]. delta_y >0) {
x_int_count ++;
sort_on_x(k, first_s);
}
}
}
void draw_lines(scan, x_int_count, index)
int scan, x_int_count, index;
{
int k, x, x1, x2;
for (k=1; k< (int) (x_int_count/2+1.5); k++)
{
while(sides[index]. delta_y = = 0) index ++;
x1=(int)(sides[index]. x_int +0.5);
index ++;
while(sides[index].delta_y = = 0) index ++;
x2 = (int) (sides [index]. x_int +0.5);
move((short)x1, (short)scan);
line((short)x2, (short)scan, status);
index ++;
}
}
void update_sides_list( )
{
int k;
for (k=first_s; k<last_s +1; k++)
{
if(sides[k].delta_y >0)
{
sides[k].delta_y - -;
sides[k]. x_int - = sides[k]. x_change_per_scan;
}
}
}
程序2.3.1 扫描线填色程序
1、sort_on_bigger_y子程序的主要功能是按照输入的多边形,建立起活性边表。操作步骤是:对每条边加以判断:如非水平边则调用put_in_side_list子程序放入活性边来;如是水平边则直接画出。
2、put_in_sides_list子程序的主要功能是将一条边存入活性边表之内。操作步骤是:对该边判别是否左顶点或右顶点,如果将入边之终点删去,按照y_top的大小在活性边表中找到该点的合适位置,在该边的位置中填入数据。
3、update_first_and_last子程序的主要功能是刷新活性边表的first和last两根指针的所指位置,以保证指针指出激活边的范围。
4、process_x_intersections子程序的主要功能是对活性边表中的激活边(即位于first和last之间的,并且? y? 0的边)按照x_int的大小排序。操作步骤是:从first到last,对每一根? y? 0的边,调用sort_on_x子程序排入活性边表中合适位置。
5、sort_on_x子程序主要功能是将一条边side[entry],在活性边表的first到entry之间按x_int的大小插入合适位置。操作步骤是:检查位于entry的边的x_int是否小于位置entry-1的边的x_int,如是,调用swap子程序交换两条边的彼此位置。
6、swap子程序的主要功能是交换活性边表中两条相邻位置边的彼此位置。
7、draw_lines子程序的主要功能是在一条扫描线位于多边形内的部分,填上指定的色彩。操作步骤是:在活性边表的激活边范围内,依次取出Δy¹ 0两边的x_int,作为两个端点(x1, scan),(x2, scan),画一条水平线。
8、update_sides_list子程序的主要功能是刷新活性边表内激活边的值:Δy=Dy-1
x_int=x_int_x_chang_per_scan;
-
2.3 区域填充算法
2007-04-07 10:43:25
2.3 区域填充算法
2.3.1 基础知识
区域填充即给出一个区域的边界,要求对边界范围内的所有象素单元赋予指定的颜色代码。区域填充中最常用的是多边形填色,本节中我们就以此为例讨论区域填充算法。
多边形填色即给出一个多边形的边界,要求对多边形边界范围的所有象素单元赋予指定的色代码。要完成这个任务,一个首要的问题,是判断一个象素是在多边形内还是外。数学上提供的方法是“扫描交点的奇偶数判断”法:
1、将多边形画在纸上。
2、用一根水平扫描线自左而右通过多边形而与多边形之边界相交。扫描线与边界相交奇次数后进入该多边形,相交偶次数后走出该多边形。图2.3.1示出这类情况:扫描线与多边形相交四点。相交a点之后入多边形;交b点(第2交点)之后出多边形;交c点(第3交点)之后又入多边形;交d点(第4交点)之后又出多边形。
上述方法似乎能完满地解决问题,但事实并非如此,因为直线在光栅化后变成了占有单位空间的离散点。图2.3.1中的A点处和B、C处,在光栅化后变成图2.3.2所示的情况。此时,使用上述判断法则,在A、B、C处发现错判现象。在A处,扫描线通过一点后以为入多边形,其实此时已出多边形。结果是在A点之后的扫描线段上全都错误地填上色。在B和C处,因为光栅化后,使得扫描线通过交点的个数发生变化而同样导致填色错误。因此,原始的奇偶判断方法需要加以周密地改善,才能成为计算机中实用的填色算法。
图2.3.1 图2.3.2
填色算法分为两大类:
1、扫描线填色(Scan-Line Filling)算法。这类算法建立在多边形边边界的矢量形式数据之上,可用于程序填色,也可用交互填色。
2、种子填色(Seed Filling)算法。这类算法建立在多边形边边界的图象形式数据之上,并还需提供多边形界内一点的坐标。所以,它一般只能用于人机交互填色,而难以用于程序填色。
-
2.2.2 圆的Bresenham算法
2007-04-07 10:42:40
2.2.2 圆的Bresenham算法
设圆之半径为r。先考虑圆心在(0,0),并从x=0, y=r开始的顺时针方向的1/8圆周的生成过程。在这种情况下,x每步增加1,从x=0开始,到x=y结束。即有:
xi+1=xi+1
相应的yi+1则在两种可能中选择:
yi+1=yi,或者yi+1=yi-1
选择的原则是考察精确值y靠近yi还是靠近yi-1(图2.2.2),计算式为:
y2=r2-(xi+1)2
d1=yi2-y2
=yi2-r2+(xi+1)2
d2=y2-(yi-1)2
=r2-(xi+1)2-(yi-1)2

图2.2.2 y的位置
令pi=d1-d2,并代入d1, d2,则有
pi=2(xi+1)2+yi2+(yi-1)2-2r2 (2.2.1)
pi称为误差。如果pi<0则yi+1=yi,否则yi+1=yi-1。pi的递归式为:
pi+1=pi+4xi+6+2(yi2+1-yi2)-2(yi+1-yi) (2.2.2)
pi的初值由式(2.6)代入xi=0, yi=r而得
p1=3-2r (2.2.3)
根据上面的推导,圆周生成算法思想为:
1、求误差初值,p1=3-2r; i=1;画点(0, r);
2、求下一个光栅位置:
xi+1=xi+1;
if pi<0 则yi+1=yi;
否则yi+1=yi-1;
3、画点(xi+1, yi+1)
4、计算下一个误差:
if pi<0 则pi+1=pi+4xi+6;
否则 pi+1=pi+4(xi-yi)+10;
5、i=i+1; if x=y则end;否则返2。
虽然式(2.2.2)式表示pi+1的算法似乎很复杂,但因为yi+1只能取值yi或yi-1,因此在算法中,第4步的算式变得很简单,只须作加法和4的乘法。因此圆的Bresenham算法运行速度也是很快的,并适宜于硬件实现。
圆的Bresenham算法的程序实现见程序2.2.1。
circle (xc, yc, radius, c)
int xc, yc, radius, c;
{
int x, y, p;
x=0;
y=radius;
p=3-2*radius;
while (x<y){
plot_circle_points(xc, yc, x, y, c);
if (p<0) p=p+4*x+6;
else{
p=p+4*(x-y)+10;
y-=1;
}
x+=1;
}
if (x= =y)
plot_circle_points(xc, yc, x, y, c);
}
plot_circle_points(xc, yc, x, y, c)
int xc, yc, x, y, c;
{
set_pixel(xc+x, yc+y, c);
set_pixel(xc+x, yc+y, c);
set_pixel(xc+x, yc-y, c);
set_pixel(xc-x, yc-y, c);
set_pixel(xc+y, yc+x, c);
set_pixel(xc-y, yc+x, c);
set_pixel(xc+y, yc-x, c);
set_pixel(xc-y, yc-x, c);
}
程序2.2.1 Bresenham的圆生成算