铺砖阶数
3

星形图案着色:让同一种形状自动穿上同一种颜色

  • 阅读 7
  • 点赞 1
  • 收藏 1

打开“星星图案”这一页:平面上铺满风筝形和飞镖形的砖,每一块砖里又画了两条圆弧。圆弧首尾相接,绕出一片星形的花纹。人眼一看就知道“这个星形和那个星形一模一样”,可计算机手里只有一堆圆弧的坐标——它并不知道什么叫“一模一样”。要让它给同一种形状上同一种颜色,得先替它回答两个问题:哪些地方算“同一块”?哪些块算“同一种形状”?

第一个问题:什么算“同一块”。最直观的办法是想象往图上倒水——把圆弧当成墙,水能流到一起的就是同一块,流不过去的才是两块。这里有个容易忽略的细节:墙如果只有一小段、两头都悬在空处,水就能从墙的尽头绕过去,墙的两侧其实是连通的。这个图案里恰好就有这种情况:一个风筝形被圆弧切出的“小帽子”和“中间那块”,看上去被圆弧分隔开了,其实绕过圆弧悬空的端点就通着,它们属于同一块。如果按“被线条围住的格子”去分块,就会把它们错当成两块。

第二个问题:什么算“同一种形状”。这些形状没有固定的边数——星形五瓣、菱形四边、小船形一头尖一头圆,边还都是弧,所以不能去比“有几条边、每条多长”。换个问法就简单了:站在一块区域的中心往四面看,看到的轮廓是什么样?把这圈轮廓记下来——星形在几个方向上伸出尖角,菱形伸出四个角,小船形则是一头尖一头圆。两圈轮廓如果“节奏”一致,就把它们看成同一种形状。

为什么转一下、挪一下、放大缩小都不影响判断?整体旋转,只是把那圈轮廓的记录循环挪了个位置;整体平移,只是把中心挪了;整体放大缩小,只是把轮廓等比例缩放。三种变化都不改变轮廓的节奏,所以判断形状时不用管图形摆在哪、转了多少度、是大是小。这也是为什么每细分一层、图形整体缩小一个黄金比例之后,同一族形状依然会被认成同一种。

颜色怎么给才不会乱跳。把全图所有区域按轮廓节奏归成几类之后,每一类配一个颜色。为了稳定,颜色不按“发现的先后”分配,而按这一类的规模从大到小排——最大的星形族永远拿同一种颜色。这样拖动滑杆改变细分阶数时,星形是什么颜色、菱形是什么颜色始终不变;否则每次重新识别都可能“跳色”,看起来像是图案变了。

实现里有三个小设计,思路同样很朴素。第一是分辨率的取舍:细分越深、形状越小,用来“看”形状的网点就得越细,否则最小的形状会被糊成一类;但网点太粗又会把小区域整批丢掉——所以网点密度是跟着“砖的大小”走的,而不是跟着画布大小走。第二是填充要铺到弧线下面:先铺颜色、再把黑色圆弧盖上去;反过来做,弧线附近会露出一圈白缝。第三是判断连通时真的在“倒水”:把圆弧覆盖到的点标成障碍,从每个空点向外漫开,漫不到一起的就是两块——和第一段说的办法完全一致,所以结果符合直觉。

把“给形状上色”翻译成“找连通块、比较轮廓节奏”之后,整件事不需要任何公式。整幅图上千块区域,最后只归成三种形状;每细分一层,三种形状的数量按黄金比例增长,但“种类”始终是这三种。想自己验证,拖动文章顶部的滑杆:每换一个阶数,看那些形状是怎样被认出来的——同一种形状,永远是同一种颜色。

未登录也可以先写:点发表会先登录,内容会保留0/500

评论 0

评论加载中…