river-sim/color.py
2024-11-28 19:00:47 +08:00

117 lines
3.4 KiB
Python

import numpy as np
from typing import Dict, Tuple
import json
def create_color_gradient_mapping(val_sequence: np.ndarray) -> Dict[int, tuple]:
"""
创建颜色渐变映射,颜色值范围为0-255,使用Python list类型,分界值四舍五入为整数
Parameters:
val_sequence: numpy数组,包含分界值序列
Returns:
Dict[int, tuple]: 键为四舍五入后的分界值(整数),值为对应的RGBA颜色元组(Python list)
"""
# 确保输入是numpy数组
val_sequence = np.array(val_sequence)
# 定义基础颜色 (蓝色到红色),使用0-255格式和Python list类型
blue = [0, 0, 255, 255] # 起始蓝色 (R,G,B,A)
red = [255, 0, 0, 255] # 结束红色 (R,G,B,A)
# 创建结果字典
result = {}
# 添加第一个元素(纯蓝色)
result[round(float(val_sequence[0]))] = tuple(blue)
# 为中间值生成渐变色
for i in range(1, len(val_sequence) - 1):
# 计算当前位置的比例
ratio = i / (len(val_sequence) - 1)
# 线性插值计算当前颜色
current_color = [int(b * (1 - ratio) + r * ratio) for b, r in zip(blue, red)]
result[round(float(val_sequence[i]))] = tuple(current_color)
# 添加最后一个元素(纯红色)
result[round(float(val_sequence[-1]))] = tuple(red)
return result
def get_color_from_value1(
value: float, color_mapping: Dict[int, Tuple[int, int, int, int]]
) -> Tuple[int, int, int, int]:
"""
根据输入的值,从颜色映射字典中查找对应的颜色,使用线性插值
Parameters:
value: 输入值
color_mapping: 颜色映射字典
Returns:
Tuple[int, int, int, int]: RGBA颜色元组
"""
if value <= 10:
return (0, 0, 255, 255)
if value >= 3500:
return (255, 0, 0, 255)
# 找到小于等于输入值的最大分界值
max_key = max([k for k in color_mapping if k <= value])
# 找到大于输入值的最小分界值
min_key = min([k for k in color_mapping if k > value])
# 计算当前值在两个分界值之间的比例
max_val = color_mapping[max_key]
min_val = color_mapping[min_key]
ratio = (value - max_key) / (min_key - max_key)
# 线性插值计算颜色
current_color = [
int(max_c * (1 - ratio) + min_c * ratio)
for max_c, min_c in zip(max_val, min_val)
]
return tuple(current_color)
def get_color_from_value2(
value: float, color_mapping: Dict[int, Tuple[int, int, int, int]]
) -> Tuple[int, int, int, int]:
"""
根据输入的值,从颜色映射字典中查找对应的颜色
Parameters:
value: 输入值
color_mapping: 颜色映射字典
Returns:
Tuple[int, int, int, int]: RGBA颜色元组
"""
# 找到小于等于输入值的最大分界值
max_key = max([k for k in color_mapping if k <= value])
return color_mapping[max_key]
# 使用示例:
if __name__ == "__main__":
# 生成原始序列
x_min = 10
x_max = 3500
a = 0.25
n = 19
val = (np.linspace((x_min**a), (x_max**a), n)) ** (1 / a)
# 生成颜色映射
color_mapping = create_color_gradient_mapping(val)
print(json.dumps(color_mapping))
# 使用get_color_from_value()方法查找颜色
print(get_color_from_value1(0, color_mapping)) # (15, 0, 240, 255)
print(get_color_from_value1(4500, color_mapping)) # (255, 0, 0, 255)
print(get_color_from_value1(50, color_mapping)) # (64, 0, 191, 255)