计算三个矩形的最大公共表面

时间:2018-03-29 14:34:14

标签: c# winforms

我试图计算金属板的最大公共表面,以减少浪费我们的材料。

我相信我成功了,但我不确定这是不是最好的方法。

这是否有现成的数学函数?

这是我的解决方案。

   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;
    }
}

0 个答案:

没有答案