[英]How to get index of elements between the first and last values of an array in Java
我正在开发一个程序,其中我将一种颜色与阵列中的其他颜色进行比较。 我使用欧几里得色彩距离公式( wiki链接 )确定两种颜色之间的色彩距离,但是我想做的是获取第二,第三和第四最小值的索引,因此我可以将这些索引的值分配给的值。它被比较。 这是我尝试过的。
private void findUnknownColors(Color[] firstAnchor, Color[] foundAnchor){
//Find distance between each color in first anchor and color arr
double[] storeClosestColors = new double [24];
//fill the array with a random value.
Arrays.fill(storeClosestColors, 5000);
for(int i = 0; i < colorArray.length; i++){
storeClosestColors[i] = colorDistance(firstAnchor[0], colorArray[i]);
if(i < storeClosestColors[2]){
storeClosestColors[2] = i;
}
}
//get 3 closest colors disregarding 0.0
System.out.println("Closest colors: " + Arrays.toString(storeClosestColors));
}
这是我比较颜色以及确定彼此之间差异的方式。 它返回一个表示其差异的浮点值。 距离越近,它们在RGB光谱上的距离就越大。
public double colorDistance(Color c1, Color c2) {
double rmean = (c1.getRed() + c2.getRed()) / 2;
int r = c1.getRed() - c2.getRed();
int g = c1.getGreen() - c2.getGreen();
int b = c1.getBlue() - c2.getBlue();
double weightR = 2 + rmean / 256;
double weightG = 4.0;
double weightB = 2 + (255 - rmean) / 256;
//System.out.println(Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b));
return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b);
}
这是输出。
Color array: [java.awt.Color[r=171,g=162,b=184], java.awt.Color[r=103,g=7,b=10], java.awt.Color[r=183,g=60,b=67], java.awt.Color[r=111,g=20,b=37], java.awt.Color[r=0,g=4,b=45], java.awt.Color[r=72,g=127,b=57], java.awt.Color[r=171,g=172,b=199], java.awt.Color[r=83,g=146,b=89], java.awt.Color[r=146,g=171,b=62], java.awt.Color[r=0,g=3,b=30], java.awt.Color[r=165,g=61,b=49], java.awt.Color[r=140,g=181,b=78], java.awt.Color[r=155,g=22,b=22], java.awt.Color[r=170,g=151,b=64], java.awt.Color[r=5,g=10,b=64], java.awt.Color[r=155,g=147,b=173], java.awt.Color[r=34,g=131,b=51], java.awt.Color[r=140,g=165,b=51], java.awt.Color[r=1,g=15,b=63], java.awt.Color[r=30,g=139,b=64], java.awt.Color[r=178,g=168,b=188], java.awt.Color[r=170,g=36,b=33], java.awt.Color[r=113,g=26,b=46], java.awt.Color[r=112,g=25,b=44]]
Closest colors: [271.20551190471775, 188.49519224638064, 0.0, 148.0690295098877, 304.4738994868854, 221.26990553111827, 301.1983358187757, 236.5966372330765, 230.12584023475068, 309.0199161765306, 40.283177320067495, 252.41092952514953, 112.21335008589664, 183.30020415632384, 291.59154464121553, 242.0912147311422, 273.11361532336684, 222.63613286313162, 293.7586168948921, 285.47859349476624, 283.3636066853858, 73.66764469561926, 135.36298134552888, 138.41173575152507]
我想我可以给您一些有关如何做自己想做的建议(根据我的理解)。
C
(*)计算colorDistance
的每种颜色的colorArray
,并以与colorArray
的颜色相同的顺序存储每种颜色的距离。 让我们将数组命名为colorDistances
。 因此, colorDistances[i] = Distance between colorArray[i] and C
。 colorDistances
数组。 让我们将数组命名为colorDistancesCopy
。 colorDistancesCopy
执行插入排序 。 在进行排序时,请跟踪每个步骤(**)中colorDistancesCopy
元素的索引变化。 colorDistancesCopy
,以及未排序的colorDistances
数组中每个元素的顺序。 根据这些信息,您可以轻松地从颜色C
确定colorArray
的第二,第三,第四最接近的颜色。 (*):从您的代码中,我看到的是C
的值将来自数组( firstAnchor
)。 在这种情况下,如果必须使用firstAnchor
所有值,那么您将不得不重复执行该过程。
(**):要轻松跟踪每个步骤中的索引更改,您将需要两个附加数组-一个将存储未排序数组中已排序元素的位置,另一个将存储未排序元素的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.