2011年11月26日星期六

阮一峰的网络日志

阮一峰的网络日志


骰子作画的算法

Posted: 26 Nov 2011 05:28 AM PST

程序员Scott MacDonald做了一个很有趣的项目----骰子作画

他用黑底白点的骰子。

模拟出一张人像照片。

把图像放大,就可以看得更清楚。

他一共用了2500多颗骰子。

最后的成品就是这样。

任何一张图片都可以用骰子模拟出来,算法非常简单:将图片分成若干个区域,每个区域经过计算以后,用1-6之间的一个整数表示,代表骰子的一个面。这种将连续的量转化成不连续的整数的算法,属于vector quantization(矢量量化)的一个应用。

具体来说,

第一步,将图片分割成16像素x16像素的小方块。

  for (int i=0; i < (pic_width/16); ++i) {

    for (int j=0; j < (pic_height/16); ++j) {

      patch = cropped_img.get(i*16, j*16, 16, 16);

    }

  }

第二步,每个小方块内共有256个像素,将每个像素点的灰度值,存入一个数组。

  for (int k=0; k < patch.pixels.length; ++k) {

   x[k] = rgb2gray(patch.pixels[k]);

  }

  int rgb2gray(int argb) {

    int _alpha = (argb >> 24) & 0xFF;

    int _red = (argb >> 16) & 0xFF;

    int _green = (argb >> 8 ) & 0xFF;

    int _blue = (argb) & 0xFF;

    return int(0.3*_red + 0.59*_green + 0.11*_blue);

  }

第三步,计算该数组的平均值,并用1-6之间的一个整数来表示。

  int dice_num = six_step_gray(mean(x));

  int mean(int[] x) {

    float m = 0;

    for (int i=0; i < x.length; ++i) {

      m += x[i];

    }

    m = m/x.length;

    return int(m);

  }

  int six_step_gray(int x) {

    if (0 <= x && x <= 41) return 1;

    if (41 < x && x <= 83) return 2;

    if (83 < x && x <= 124) return 3;

    if (124 < x && x <= 165) return 4;

    if (165 < x && x <= 206) return 5;

    if (x < 206 && x <= 247) return 6;

    else return 6;
  }

整数1,表示骰子朝上的一面有1个白点;整数2,表示有2个白点;以此类推。白点越少,表示这个区域越接近全黑;白点越多,表示越接近全白。根据白点值,将骰子依次放入,就能模拟出全图。

这种算法早在1981年就有人提出,当时用的是1~9个白点的多米诺骨牌。

如果区域划分得越小,模拟图的生成效果就越好。

此外,不用编程,使用Photoshop也可以得到类似效果。

(完)

文档信息

2011年11月24日星期四

阮一峰的网络日志

阮一峰的网络日志


珠海印象

Posted: 23 Nov 2011 07:54 PM PST

过去一周,我在珠海旅行。

这是我第一次去珠海,写一些感想。

动身之前,我心目中的珠海,是一个美丽的、现代化的、宜居的海滨城市。可是,身临其境,我发现并非如此。

虽然临海,但是除了一条狭长的情侣路,完全看不出这是一个海滨城市;市内的旅游景点非常少,几乎没有什么值得去的地方;市区与国内其他大城市一样,高楼林立,五光十色,交通拥堵,铺天盖地的喧哗和广告;马路很宽,路灯昏暗,凡是行人稀少的路段,车速都飞快,一个红灯长达100秒;路上很难拦到出租车,而且由于主干道不设自行车道,即使拦到,路边停车也很困难。

我感觉,珠海的城市规划很成问题。一个典型的例子就是情侣路。这是珠海的名片,外地游客必到之处,但是完全没有开发好。整个情侣路长达十多公里,但是一路上几乎没有任何商业设施,买瓶水都很麻烦。情侣路旁边居然是一条宽阔的高速干道,车速极快,使得游客无法自由通行,仿佛这条路存在的主要目的,就是为了行车,而不是为了游览。

海滨浴场是整条路上唯一的沙滩,设施破败陈旧,垃圾遍地,显然缺乏管理和资金投入。很难想象,市政当局居然会对这样一个重要的城市休闲地标放任不管。倒是房地产商充分利用了这个地段,海滨浴场周围都是密密麻麻的楼盘,把整个沙滩像山谷一样围了起来,这块理应属于全体市民的海滩,实际上成了业主们的后花园。

总之,珠海这个城市缺乏特色。拱北口岸附近,是全市最热闹的地方,即使半夜12点,通关的人流都络绎不绝。给我的感觉是,这个城市的主要功能,就是通往澳门的通道。

但是,珠海其实拥有很好的自然条件,如果好好规划,完全不会是现在这个样子。要是将来有人收集中国城市规划的失败案例,珠海可以算一个。

旅行的最后两天,我去了珠江口的外伶仃岛。岛上环境优美,海水清澈,生活宁静安逸,各种设施齐全,更重要的是网络全覆盖。如果以后有空,我会考虑在岛上租一间房,休假一个月。

(完)

文档信息

2011年11月12日星期六

阮一峰的网络日志

阮一峰的网络日志


EOF是什么?

Posted: 12 Nov 2011 03:42 AM PST

我学习C语言的时候,遇到的一个问题就是EOF

它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。

比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。

  int c;

  while ((c = fgetc(fp)) != EOF) {

    putchar (c);

  }

很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统就认为文件结束了。

但是,后来我发现,EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。

  #define EOF (-1)

于是,我就困惑了。

如果EOF是一个特殊字符,那么假定每个文本文件的结尾都有一个EOF(也就是-1),还是可以做到的,因为文本对应的ASCII码都是正值,不可能有负值。但是,二进制文件怎么办呢?怎么处理文件内部包含的-1呢?

这个问题让我想了很久,后来查了资料才知道,在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)。至于系统怎么知道文件的结尾,资料上说是通过比较文件的长度。

所以,处理文件可以写成下面这样:

  int c;

  while ((c = fgetc(fp)) != EOF) {

    do something

  }

这样写有一个问题。fgetc()不仅是遇到文件结尾时返回EOF,而且当发生错误时,也会返回EOF。因此,C语言又提供了feof()函数,用来保证确实是到了文件结尾。上面的代码feof()版本的写法就是:

  int c;

  while (!feof(fp)) {

    c = fgetc(fp);

    do something;

  }

但是,这样写也有问题。fgetc()读取文件的最后一个字符以后,C语言的feof()函数依然返回0,表明没有到达文件结尾;只有当fgetc()向后再读取一个字符(即越过最后一个字符),feof()才会返回一个非零值,表示到达文件结尾。

所以,按照上面这样写法,如果一个文件含有n个字符,那么while循环的内部操作会运行n+1次。所以,最保险的写法是像下面这样:

  int c = fgetc(fp);

  while (c != EOF) {

    do something;

    c = fgetc(fp);

  }

  if (feof(fp)) {

    printf("\n End of file reached.");

  } else {

    printf("\n Something went wrong.");

  }

除了表示文件结尾,EOF还可以表示标准输入的结尾。

  int c;

  while ((c = getchar()) != EOF) {

    putchar(c);

  }

但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。

Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D);Windows中,Ctrl-Z表示EOF。(顺便提一句,Linux中按下Ctrl-Z,表示将该进程中断,在后台挂起,用fg命令可以重新切回到前台;按下Ctrl-C表示终止该进程。)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按"字面含义"解读下一个输入,要是想按"字面含义"输入Ctrl-V,连续输入两次就行了。

(完)

文档信息

2011年11月6日星期日

阮一峰的网络日志

阮一峰的网络日志


天使湾创业之夏Demo Day见闻

Posted: 06 Nov 2011 12:27 AM PDT

今年5月,我对天使湾创投的庞小伟,做过一个访谈

当时,他正在筹备"创业之夏"活动,准备模仿美国的Y Combinator,资助15个创业团队,在杭州集中开发3个月。现在,3个月过去了,"创业之夏"已经结束,到了15个创业团队拿出Demo的时候了。

昨天,就是天使湾举办的Demo Day,让创业团队与风险投资家直接见面,展示自己取得了怎样的成果。非常感谢庞兄,邀请我观摩这个活动。

下面就是我昨天在杭州的见闻。

===========================================

会场在西湖南麓、凤凰山下的万松书院内,要从万松岭路进去,这是一条幽静的小马路。

万松书院是明清两代杭州最大的文人读书讲学的场所,现在成了公园。大门口是一个大型浮雕,传说梁山伯和祝英台在此相遇。

从大门进去,沿着台阶往山上走,然后右拐100米,就到了正谊堂。

这座小楼是2009年重建的,远看像是古建筑,底下还有石砌平台,其实是一个现代化的讲课、开会的场所。

会场内已经架设了投影,这是庞小伟正在发言。

接下来的两个多小时,就是15个创业团队的项目展示,我先说一下我的感想。

  (1)所有的团队都非常年轻,大部分人都是85年后出生,还有几个90后团队。但是,所有人在开发上都很成熟,至少没有一个产品让我觉得幼稚,这表明中国互联网开发的新生力量非常强大,未来可期。

  (2)每个团队有8分钟的展示时间,实事求是地说,我觉得有些团队的展示不是很理想,听了以后,抓不住重点,不知道产品和团队的卖点在哪里。建议这些年轻的朋友,多向乔布斯和奥巴马学习公开讲演的技巧。

  (3)15个产品当中,有6、7个是纯粹的手机App(应用程序),剩下来的项目也全部打算开发手机端。几乎所有人都把手机应用,当做自己项目的重点。虽然我也认同移动互联网的广阔未来,但是太关注手机端,会不会是一种局限,我个人觉得有一个好的API(应用程序接口)意义可能更大一些。

  (4)这些产品大部分都是针对个人的生活需求,针对企业商业需求的产品太少。

  (5)从创意到成品,三个月的时间,还是太短了。大部分项目的完成度不高,有好几个只是刚刚能够在本机上运行,只能做到让你看懂他的想法,距离真正可以上线的Demo还要一段时间。不过,所有团队都拿出了自己的作品,这一点很不容易。

  (6)最后一点感想,是关于我自己的。我发现,我与风险投资家(尤其是不懂技术的风险投资家)沟通起来很不顺畅,共同语言比较少,聊了一会就找不到话题了,远不如我与工程师聊天那样自如。我还是不适应这种社交场合。

=============================================

接着,我就来介绍一下这15个项目(按昨天的出场顺序)。

我只介绍项目的基本情况,不做评论,也不涉及开发团队,因为我对他们本人都不熟悉。我根据的是自己对产品的理解,可能不是很准确。一些项目的网站还没有完成,也就不提供网址了。

1. 会云

网址:http://www.confone.com

【简介】

会议管理工具。

会议组合者可以在网站上,注册一个会议,然后这个会议就有一个自己的主页(示例)。通过这个主页,你可以邀请会议参加者、发布会议消息和FAQ、增加参会人员的互动等等。

2. 乐帮

网址:http://whohelp.me/

【简介】

基于LBS的移动帮助应用。

生活中,我们经常遇到麻烦事,比如电脑蓝屏了、下雨没带伞、宠物走丢了......这时,你会希望身边有人可以帮你。"乐帮"使你可以向3000米以内的其他用户求援,他们打开手机,看到周围有哪些需要帮助的事情,再决定是否给你发短信或打电话。

3. 木耳

【简介】

个人信息展示平台。

木耳允许用户自定义个人主页,用户把任何想要展示的内容(图片、文本、音乐等等),拖动到页面上就可以了。页面的布局和内容,完全自定义,所有操作只需要鼠标就能完成。

4. 百里挑一

网址:http://www.bailty.com

【简介】

随身的商品口碑和购物决策助手。

当你看到琳琅满目的商品,是否觉得无从下手?你只要拿出手机,拍摄商品的条形码,"百里挑一"就会返回商品的基本信息,以及其他消费者对该商品的评价。

5. 错落

网址:http://cuoluo.com

【简介】

随机生成器。

生活中有很多场合,需要得到随机结果。比如,你想随机看一张照片、随机听一首歌、随机阅读一段文字、随机生成一段密码、随机选择一个彩票号码、随机为来宾抽奖......"错落"就是一个随机生成器,为你返回一个随机结果。

6. 有鱼

网址:http://youyur.com/

【简介】

项目外包平台。

项目主在"有鱼"上面发布工作,自由职业者在上面找工作,双方约定完成日期和薪酬。

7. 觅乎

网址:http://www.miihuu.com

【简介】

个人信息的搜索工具。

"觅乎"允许用户将自己的个人信息(比如浏览历史、电子邮件、微博发言、个人网志等等)汇集在一个地方,然后统一进行搜索。

8. 聚朋

网址:http://www.juupoo.com

【简介】

聚会管理工具。

你可以发起一个聚会,然后通过网页,自动短信通知所有参加人员。(抱歉,这个项目是下半场的第一个项目,我进会场晚了,有一些介绍没有听到。)

9. 52赫兹

网址:http://www.52hz.com/

【简介】

网页推荐引擎。

根据用户收藏的网页,向他推荐个性化的相关网页,与美国网站StumbleUpon类似。

10. Timap

网址:http://timap.me/

【简介】

基于LBS的日程管理工具。

用户可以用自然语言输入日程(比如"明天下午1点与张先生在xx饭馆吃饭"),Timap会自动分析语义,得到时间、地点(结合用户的当前位置)、事项,并向用户推荐最优日常安排。

11. 小恩爱

网址:http://www.xiaoenai.com

【简介】

情侣应用。

"小恩爱"必须情侣两人共同使用,供双方进行各种特殊沟通。留言的时候,可以设置规则(比如,男生收信后,倒计时8小时才能打开);女生还可以向男生出选择题("我最喜欢以下哪一种口味的冰激凌?"),并设置奖励和惩罚。

12. 琥珀

【简介】

基于LBS的校园社交应用。

主要是四大功能:发送匿名情书;实时抓拍并分享校园八卦;校园雷达,3D显示校园各个位置最新发生的事件;校园密友,显示你关注的人现在的动态。

13. 饭有引力

网址:http://www.fanyor.com/

【简介】

社会化的聚餐平台。

它让你通过聚餐,结识新朋友。你可以在"饭有引力"上,浏览新发起的聚餐,找到自己感兴趣的人和食品,然后申请加入;你也可以自己发起聚餐,等待别人申请加入。所有聚餐的人,还可以一起在网上发言讨论。

14. 同行

网址:http://itongxing.com/

【简介】

基于LBS的拼车应用。

当你想在附近找人拼车、或找到想搭你的车的人,"同行"会告诉你有没有这样的人,你也可以发出这样的消息,"同行"会帮你自动推送到周围的用户,并转发到社交网站上。

15. 马蹄

【简介】

自助游行程的制定和管理工具。

用户确定旅游目的地和游玩天数之后,"马蹄"会帮助用户制定一个合理的行程和路线,并在旅行过程中,不断帮助用户实施这份行程,还可以根据用户现在所处的位置,实时推荐周围的景点。

==================================

如果你是投资者,对上述项目感兴趣的话,可以通过天使湾联系开发者。

如果你是普通用户,欢迎积极使用这些产品,为创业团队提供鼓励和建议。

如果你是创业者,欢迎向天使湾申请风投,也欢迎在11月底报名参加明年3月~5月举办的第二期创业训练营。

(完)

文档信息