假设我有个现成的颜色列表都是16进制的
例如
$000000
$110000
$002200
$000088
$000099
$00CC00
$0000BB
$0000CC
$AA00DD
$0000EE
$2200FF
$FFFFFF然后我随机给出一个颜色的16进制代码,想计算与列表中哪个颜色最接近,求算法,分不够另外开帖
例如
$000000
$110000
$002200
$000088
$000099
$00CC00
$0000BB
$0000CC
$AA00DD
$0000EE
$2200FF
$FFFFFF然后我随机给出一个颜色的16进制代码,想计算与列表中哪个颜色最接近,求算法,分不够另外开帖
三个分量差值的绝对值之和最小的即为最接近的
DeltaI, DeltaJ: Cardinal;
I, J: Integer;
begin
ListBox1.Sorted := True; // 保存颜色列表
with TStringList.Create do
try
Assign(ListBox1.Items);
Sorted := True;
if not Find(Edit1.Text, I) then // Edit1.Text:随机给出一个颜色的16进制代码
begin
J := I - 1;
DeltaJ := ABS(StringToColor(Strings[J]) - StringToColor(Edit1.Text));
DeltaI := ABS(StringToColor(Strings[I]) - StringToColor(Edit1.Text));
I := IfThen(DeltaJ > DeltaI, I, J);
end;
Edit2.Text := Strings[I]
finally
Free;
end;
end;
似乎应该是三个分量差值平方和最小的为最接近的
I := IfThen(DeltaJ > DeltaI, I, J);
小弟学识浅薄,修改不来...1楼的思路正确测试下来没问题,散分