张芷铭的个人博客

使用黄金角(137.5°)分割色相环,实现整数 ID 与 RGB 颜色的双向映射,相邻 ID 颜色差异最大化。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import colorsys
import math

def id_to_color(id_num):
    """将整数 ID 转换为高对比度 RGB 颜色"""
    hue = (id_num * 137.5) % 360  # 黄金角色相分配
    hue /= 360.0
    saturation, value = 0.8, 0.95
    r, g, b = colorsys.hsv_to_rgb(hue, saturation, value)
    return (int(r * 255), int(g * 255), int(b * 255))

def color_to_id(r, g, b):
    """从 RGB 颜色还原原始 ID"""
    h, _, _ = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
    hue_angle = h * 360.0
    return int(round((hue_angle / 137.5) % (360 / 137.5)))

核心特性

特性说明
黄金角色相137.5° 分割,数学证明最大化颜色差异
固定参数饱和度 0.8、亮度 0.95,视觉友好
可逆映射ID ↔ 颜色双向转换,O(1) 复杂度
容量支持 0 到 16,777,215(24 位 RGB 上限)

输出示例

1
2
3
ID 0 → RGB (243, 57, 57)
ID 1 → RGB (183, 243, 57)
ID 2 → RGB (57, 243, 126)

优势

  1. 数学最优:黄金角分配最大化颜色差异
  2. 零冲突:唯一双向映射
  3. 视觉友好:所有颜色明亮鲜艳

限制:ID 超过 16,777,215 时颜色重复。

Comments