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