我试图计算金属板的最大公共表面,以减少浪费我们的材料。
我相信我成功了,但我不确定这是不是最好的方法。
这是否有现成的数学函数?
这是我的解决方案。
private void frmCalculate_Load(object sender, EventArgs e)
{
//Width and length values can vary, this is just one of possible dimensions.
List<Material> lstGivenMaterials = new List<Calculator.Material>();
lstGivenMaterials.Add(new Calculator.Material(10, 40));
lstGivenMaterials.Add(new Calculator.Material(60, 20));
lstGivenMaterials.Add(new Calculator.Material(5, 20));
var largestCommonSurface = CalculateCommunSurface(lstGivenMaterials);
}
获取Material类列表的方法。
private decimal? CalculateCommunSurface(List<Material> givenMaterials)
{
decimal? retVal = 0;
var largestMat = givenMaterials.Max(ro => ro.Surface);
var smallestMat = givenMaterials.Min(ro => ro.Surface);
List<Material> possibleComplexing = new List<Material>();
foreach (var mat1 in givenMaterials)
{
foreach (var mat2 in givenMaterials)
{
possibleComplexing.Add(mat1);
possibleComplexing.Add(new Calculator.Material(mat1.Width, mat2.Width));
possibleComplexing.Add(new Calculator.Material(mat1.Width, mat2.Length));
}
}
var possibleValues = possibleComplexing.Where(ro => ro.Surface <= smallestMat).ToList().OrderByDescending(ro => ro.Surface).ToList();
bool isPossible;
foreach (var item in possibleValues)
{
isPossible = true;
foreach (var mat in givenMaterials)
{
//If not suitable for any material, not ok.
if (!mat.IsPossible(item))
{
isPossible = false;
break;
}
}
if (isPossible)
{
retVal = item.Surface;
break;
}
}
return retVal;
}
我的材料课。
public class Material
{
public decimal Width { get; set; }
public decimal Length { get; set; }
public decimal Surface
{
get
{
return Width * Length;
}
}
public Material(decimal width, decimal length)
{
this.Width = width;
this.Length = length;
}
internal bool IsPossible(Material refMat)
{
bool retVal = false;
if (
(refMat.Width <= this.Width && refMat.Length <= this.Length) ||
(refMat.Width<= this.Length && refMat.Length <= this.Width)
)
{
retVal = true;
}
return retVal;
}
}