refactor(color_set): 优化颜色匹配算法中的元组结构

将存储颜色匹配结果的元组从(lightness, min_wacg_abs)扩展为(lightness, avg_wacg_abs, sum_wacg_abs)
修改匹配逻辑以同时考虑平均和总和WACG值
This commit is contained in:
徐涛 2025-07-20 08:01:47 +08:00
parent afaa7d25de
commit dd1273dad4

View File

@ -49,9 +49,9 @@ fn search_for_common_wacg_color(
neutral_swatch: &NeutralSwatch,
minium_ratio: f32,
) -> Oklch {
// store in: (lightness, min_wacg_abs)
let mut minium_match: (f32, f32) = (0.0, f32::INFINITY);
let mut closest_match: (f32, f32) = (f32::INFINITY, f32::INFINITY);
// store in: (lightness, avg_wacg_abs, sum_wacg_abs)
let mut minium_match: (f32, f32, f32) = (0.0, f32::INFINITY, 0.0);
let mut closest_match: (f32, f32, f32) = (f32::INFINITY, f32::INFINITY, 0.0);
for scan_lightness in (0..=100).map(|x| x as f32 / 100.0) {
let new_target = neutral_swatch.get(scan_lightness);
let new_target_luma = map_oklch_to_luma(&new_target);
@ -60,11 +60,14 @@ fn search_for_common_wacg_color(
.map(|ref_color| match_wacg(&ref_color, &new_target_luma) - minium_ratio)
.sum();
let reference_wacgs = reference_wacgs_sum / reference_colors.len() as f32;
if reference_wacgs.abs() < closest_match.1.abs() {
closest_match = (scan_lightness, reference_wacgs);
if reference_wacgs.abs() < closest_match.1.abs() && reference_wacgs_sum > closest_match.2 {
closest_match = (scan_lightness, reference_wacgs, reference_wacgs_sum);
}
if reference_wacgs >= 0.0 && reference_wacgs.abs() < minium_match.1.abs() {
minium_match = (scan_lightness, reference_wacgs);
if reference_wacgs >= 0.0
&& reference_wacgs.abs() < minium_match.1.abs()
&& reference_wacgs_sum > minium_match.2
{
minium_match = (scan_lightness, reference_wacgs, reference_wacgs_sum);
}
}
if minium_match.1 != f32::INFINITY {