N Numbrush 下载

号码到底该放在区块的哪个位置

月牙的中心不在月牙里。给一个形状放标签这件事,比看上去难,而且做错的时候是安静地错。

号码必须落在它所标注的那个区块里面。对大多数形状来说这不难。然后你会遇到月牙——它的中间不在它自己身上。

外接矩形的中心,往往不是中心

最省事的做法是:把一个区块的所有像素取出来,找到最小和最大的 x、y,得到一个矩形,把号码放在这个矩形的正中。几行代码,跑一遍就有结果,对花瓣或者一个大致圆形的块,答案没人会有异议。

换成月牙就不行了。它的外接矩形横跨两个角和外侧的弧,矩形中心落在凹进去的那片空处——在矩形里面,在形状外面,压在旁边那个区块上。圆环更糟:中心正好在洞里,号码看起来像是在标注中间那块完全不相干的区域。

这类错误的麻烦之处在于它不会报错。程序算出了一个坐标,画上去了,一切正常。只有人看到那张图的时候,才会觉得「这个 7 是标哪块的」。

视觉中心

正确的量叫做视觉中心——在这个形状内部,离所有边界都尽量远的那个点。它保证在形状里面,而且周围留出的空间最大,也就最适合放一个需要被看清的号码。

算法上有几种实现,共同点是它们都只在形状内部搜索,因此结果不可能跑到外面去。代价是比取矩形中心贵一些,但这是一次性的:区块划分完成时算好,存下来,之后每次打开都直接用。

顺带一个好处:视觉中心同时给出了「这个点周围有多大空间」这个数值。它可以直接用来决定号码的字号,甚至决定这个号码值不值得显示。

什么时候不该显示号码

一张图放大到某个程度之前,大量小区块的号码是画不下的。硬画的结果是一堆互相压在一起的数字,比不画更难读。

所以通常有两道闸:一是缩放阈值——区块在当前屏幕尺寸下小于某个像素数,就不画它的号码;二是数量上限——同屏号码超过一定数量就只画最大的那些。两道闸都是为了同一件事:号码是用来读的,读不了就不该在那儿。

这也解释了填色时那种熟悉的操作:放大之后号码才「长出来」。它不是加载慢,是那些号码在缩小状态下本来就不应该存在。

常见问题

为什么有的号码看起来不在自己那块里?

多半是用了外接矩形的中心。对凹形状——月牙、圆环、C 形——这个点会落到形状外面。视觉中心可以避免,但需要多算一步。

为什么放大之后才出现号码?

因为缩小状态下那些号码画上去也读不了,只会互相遮挡。缩放阈值让它们在能读的时候才出现。

号码的大小是怎么定的?

通常跟着「这个点周围有多大空间」走。这个数值在算视觉中心的时候顺带就有了,所以大块的号码大、小块的号码小,是一次计算的两个产物。

拿真画布试一遍

Numbrush 是给成年人的数字填色:曼陀罗、玫瑰花窗和几何纹样,每幅十二色,窄的地方有放大镜,点错了没有任何代价。免费、离线、无广告、无账号。

在 App Store 下载

相关文章

全部指南