我试图从两个二维数组中导入数据,然后进行一些计算以获得最小值和次要最小值,但我得到的最小值是零,甚至没有值。
double[,] Cranelocations = { { 28.6744, 3.45 }, { 29.67, 7.25 }, { 30.67, -10.6 }, { 31.67, 11.02 }, { 32.67, 5.45 } };
double[,] Picklocation = { { 20.6744, -8.4656 }, { 21.6744, -8.4656 }, { 22.6744, -8.4656 }, { 23.6744, -8.4656 }, { 24.6744, -8.4656 }, { 25.6744, -8.4656 }, { 26.6744, -8.4656 }, { 27.6744, -8.4656 } };
double[,] Setlocation = { { 20.62, 5.03 }, { 24.28, 5.03 }, { 35.99, 14.55 }, { 19, 18.16 }, { 35.99, 5.26 }, { 40.18, 5.26 }, { 9.6, 13.16 } };
double[] Angles = new double[Cranelocations.GetLength(0) * Picklocation.GetLength(0) * Setlocation.GetLength(0)];
double Seta;
for (int i = 0; i < Cranelocations.GetLength(0); i++)
{
for (int j = 0; j < Picklocation.GetLength(0); j++)
{
for (int k = 0; k < Setlocation.GetLength(0); k++)
{
double C1 = Picklocation[j, 0] - Cranelocations[i, 0];
double V1 = Picklocation[j, 1] - Cranelocations[i, 1];
double C2 = Setlocation[k, 0] - Cranelocations[i, 0];
double V2 = Setlocation[k, 1] - Cranelocations[i, 1];
double C3 = Math.Sqrt(Math.Pow(C1, 2) + Math.Pow(V1, 2));
double V3 = Math.Sqrt(Math.Pow(C2, 2) + Math.Pow(V2, 2));
Seta = Math.Acos(((C1 * C2) + (V1 * V2)) / (C3 * V3));
Angles[i] = Seta * 180 / Math.PI;
Angles[k] = Seta * 180 / Math.PI;
Angles[j] = Seta * 180 / Math.PI;
}
}
}
Console.WriteLine(Angles.Min());
答案 0 :(得分:0)
我认为您需要在代码的开头声明“ Angles”变量以及“ Seta”和“ Angle”。
答案 1 :(得分:0)
您的Angles
数组具有 280 个元素:
double[] Angles = new double[Cranelocations.GetLength(0) * Picklocation.GetLength(0) * Setlocation.GetLength(0)];
由于它是double[]
,所以这些元素都不可以是null
。它们都是0
。然后在代码中,用其他数字替换该数组的前8个元素。结果是您有一个包含272个零和8个大于零的数字的数组。
该数组中的最小值是0。第二个最小值是0。第三个最小值是0。依此类推。
使用2D数组的内部尺寸(宽度为2个元素的数组)定义Angles
。注意.GetLength()
的参数:
double[] Angles = new double[Cranelocations.GetLength(1) * Picklocation.GetLength(1) * Setlocation.GetLength(1)];
那样,它只有8个零,所有零在代码中得到更新。那么最小值将为67.3864169484903
。
关于如何获得第二个最小值,最简单的解决方案可能只是对数组进行排序并打印出前两个元素。像这样:
foreach (var a in Angles.OrderBy(a => a).Take(2))
Console.WriteLine(a);